我已经看到了变量串联应该如何工作的多种方式,但它们并没有按照我的预期工作,也不确定为什么...
我正在将一个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个字符
有人可以解释我做错了什么我认为它必须与时期有关但却无法弄清楚。
答案 0 :(得分:8)
当你注意到一个较短的字符串"覆盖"更长字符串的开头,首先要考虑的是CR
字符(用于Windows和Mac行结尾)。命令替换会删除换行符,但会删除 Unix 换行符(LF
)并且不会对回车执行任何操作。
您可以通过tr -d '\r'
过滤输入以取消回车,或使用dos2unix
实用程序就地转换损坏的文件。
使用less -U
查看输出有助于调试此类问题(less -U
将回车符,制表符和退格键显示为控制字符,例如^M
^I
{ {1}})。
答案 1 :(得分:0)
您可以向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