【发布时间】:2014-08-06 09:24:55
【问题描述】:
我真的很困惑。我从两个单独的文件中读取了主机名和命令的嵌套循环。在我想放“#”注释行的文件中,主脚本需要忽略这些行。在下面的脚本中,命令被很好地读取,“#”注释行被很好地忽略了,但是主机名文件的读取得到了第一个主机名,然后终止了 while/do 循环!
如果我实际上在主机名中添加了“#”注释行,那么它会一直读取它们,直到它到达一个真正的主机名,然后终止循环。
# Read the Hostname from Hostnames.txt
while read HOST
[[ "$HOST" =~ ^#.*$ ]] && continue
do
.
while read Cmd1 Cmd2 Cmd3 Prompt
# Read Commands from Commands1.txt file but ignore comment lines
[[ "$Cmd1" =~ ^#.*$ ]] && continue
do
.
.
done < Commands1.txt
done < Hostnames.txt
更奇怪的是:如果我在[[ "$HOST" =~ ^#.*$ ]] && continue 行之后添加一行echo $HOST,它会按要求工作,但它当然会回显不需要的屏幕输出。
命令文件内容:
#Juniper commands
set cli screen-length 0,show version,exit,>
主机名文件内容
ABCD1234
【问题讨论】:
-
我很惊讶它完全有效;在
while循环中不需要do吗?他们是否将其设为可选? -
您的输入文件中的
#字符是否像您的模式所要求的那样始终 是一行中的第一个字符?你有 DOS 风格的行尾(或者更糟糕的是,混合行尾)?也许尝试更像while read ... done < <(grep -v '^#' input.txt)... -
抱歉@Tom Zych,刚才显示的“do”语句在那里。
-
嗨,@twalberg。 “#”字符是第一个字符,行尾是unix; cat -vet 文件名只显示我所期望的,没有别的。 'cat -vet Hostnames.txt # 测试评论$ ABCD1234$ ABCD1235$ # ABCD1236$ ABCD1237$'
-
猜想有人应该把它作为一个答案,所以它不会留在未回答的列表中。我会的。