问题 bash循环跳过注释行


我正在循环文件中的行。我只需要跳过以“#”开头的行。 我怎么做?

 #!/bin/sh 

 while read line; do
    if ["$line doesn't start with #"];then
     echo "line";
    fi
 done < /tmp/myfile

谢谢你的帮助!


1662
2017-09-19 04:23


起源



答案:


while read line; do
  case "$line" in \#*) continue ;; esac
  ...
done < /tmp/my/input

然而,坦率地说,往往更清楚 grep

grep -v '^#' < /tmp/myfile | { while read line; ...; done; }

15
2017-09-19 04:27



你也可以做一些太聪明的事了 expr 或后缀删除(例如, [ -z "${line%%#*}" ]),但这些与...相同或不太可读 case 选项,我想。 - pilcrow
还要删除空格(仅)前面的行 #, 使用 grep -v '^\s*#' < /tmp/myfile 相反 - 这符合 case 解决方案,鉴于此 read 剥离前导和尾随空格。 - mklement0
另一种选择(如果由于某种原因有人想避免 grep) 可能 if [[ $line =~ ^# ]]; then continue; fi。 - Ansgar Wiechers
如果while循环需要修改当前shell中的变量,那么grep解决方案将无效,因为循环在子shell中运行(除非bash 4.2可用且 set -o lastpipe 用来)。默认情况下,其他shell可以在当前shell中运行while循环。 - chepner
另一种选择是 [[ $line = \#* ]] && continue。 - chepner


答案:


while read line; do
  case "$line" in \#*) continue ;; esac
  ...
done < /tmp/my/input

然而,坦率地说,往往更清楚 grep

grep -v '^#' < /tmp/myfile | { while read line; ...; done; }

15
2017-09-19 04:27



你也可以做一些太聪明的事了 expr 或后缀删除(例如, [ -z "${line%%#*}" ]),但这些与...相同或不太可读 case 选项,我想。 - pilcrow
还要删除空格(仅)前面的行 #, 使用 grep -v '^\s*#' < /tmp/myfile 相反 - 这符合 case 解决方案,鉴于此 read 剥离前导和尾随空格。 - mklement0
另一种选择(如果由于某种原因有人想避免 grep) 可能 if [[ $line =~ ^# ]]; then continue; fi。 - Ansgar Wiechers
如果while循环需要修改当前shell中的变量,那么grep解决方案将无效,因为循环在子shell中运行(除非bash 4.2可用且 set -o lastpipe 用来)。默认情况下,其他shell可以在当前shell中运行while循环。 - chepner
另一种选择是 [[ $line = \#* ]] && continue。 - chepner