【问题标题】:Comments not being reliably ignored评论没有被可靠地忽略
【发布时间】: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" =~ ^#.*$ ]] &amp;&amp; continue 行之后添加一行echo $HOST,它会按要求工作,但它当然会回显不需要的屏幕输出。

命令文件内容:

#Juniper commands  
set cli screen-length 0,show version,exit,>

主机名文件内容

ABCD1234

【问题讨论】:

  • 我很惊讶它完全有效;在while 循环中不需要do 吗?他们是否将其设为可选?
  • 您的输入文件中的# 字符是否像您的模式所要求的那样始终 是一行中的第一个字符?你有 DOS 风格的行尾(或者更糟糕的是,混合行尾)?也许尝试更像while read ... done &lt; &lt;(grep -v '^#' input.txt)...
  • 抱歉@Tom Zych,刚才显示的“do”语句在那里。
  • 嗨,@twalberg。 “#”字符是第一个字符,行尾是unix; cat -vet 文件名只显示我所期望的,没有别的。 'cat -vet Hostnames.txt # 测试评论$ ABCD1234$ ABCD1235$ # ABCD1236$ ABCD1237$'
  • 猜想有人应该把它作为一个答案,所以它不会留在未回答的列表中。我会的。

标签: regex bash


【解决方案1】:

总结一下 cmets,do 语句放错了位置;它们应该在while 语句之后立即出现。

【讨论】:

  • 谢谢汤姆,感激不尽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
相关资源
最近更新 更多