【问题标题】:Concatenating variables in bash(debian)在bash(debian)中连接变量
【发布时间】:2013-01-31 21:03:45
【问题描述】:

我已经看到了多种变量连接应该如何工作的方式,但它们并没有按照我的预期工作,也不知道为什么......
我正在将一个 txt 文件读入一个数组 每一行都是一个域名我想做一个区域传输输出到一个文件名为 domain.zone 的文件简单的权利....

好的,这是我已经开始实际挖掘部分的脚本

#!/bin/bash
filecontent=($(cat goodFvzones.txt))
for t in "${filecontent[@]}"
do
n=".zone"
x=$t$n
echo "$x"
#dig @dnsserver -t axfr $t > $x
done

当我运行上述脚本时,如果它正在处理的域名是 domain.com 我得到的输出是: .zonen.com

预期输出将是 domain.com.zone
变量 n(5 个字符)的内容正在覆盖变量 t 的前 5 个字符 有人可以解释我做错了什么,我认为这一定与期间有关,但一直无法弄清楚。

【问题讨论】:

  • 也许您的文本文件中有CR 字符? (Windows 或 Mac 行尾)
  • 这听起来确实是个问题。您应该将其发布为答案。
  • 使用filecontent=($(cat goodFvzones.txt | tr -d '\r')) 等待@AntonKovalenko 建议作为答案。
  • 是的,这就是我应该知道的问题,我实际上是使用 dos2unix 进行转换的 Anton。但是感谢其他人的其他选择。
  • @thatotherguy 是的,添加为答案

标签: bash variables concatenation


【解决方案1】:

当您注意到较短的字符串“覆盖”了较长字符串的开头时,首先想到的应该是 CR 字符(用于 Windows 和 Mac 行结尾)。命令替换会删除换行符,但它会删除 Unix 换行符 (LF) 并且对回车没有任何作用。

您可以通过tr -d '\r' 过滤您的输入以消除回车,或使用dos2unix 实用程序就地转换损坏的文件。

使用less -U 查看您的输出有助于调试此类问题(less -U 将回车、制表符和退格显示为控制字符,例如 ^M^I^H)。

【讨论】:

    【解决方案2】:

    您可以在 IFS 中添加一个回车符 (\r),使其成为另一个空格字符,用于参数解析:

    IFS=$(printf "$IFS\r")
    filecontent=($(cat goodFvzones.txt))
    for t in "${filecontent[@]}"
    do
      n=".zone"
      x=$t$n
      echo "$x"
      #dig @dnsserver -t axfr $t > $x
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2011-05-10
      • 2013-02-13
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多