如何在bash for loop中跳过带注释(#space)的行

用下面的代码:

#!/bin/bash export LC_ALL=C for input_file in $(<inputflist.txt) do case "$input_file" in \#*) continue ;; esac echo $input_file done 

inputflist.txt具有以下内容:

 # foo.txt bar.txt 

我期望它只是打印最后一行bar.txt但它打印出来,而不是:

 foo.txt bar.txt 

什么是正确的方法来做到这一点?

这应该工作:

 while IFS= read -r line; do [[ $line =~ ^[[:blank:]]*# ]] && continue echo "$line" done < inputflist.txt 

输出:

 bar.txt 

不要用for来读取行,而是使用while循环:

 while IFS= read -r line;do [[ $line =~ ^[[:space:]]*# ]] || echo "$line" done <file 

注意:

  1. 如果您没有正确设置IFS ,您将失去任何缩进。
  2. 你应该几乎总是使用阅读-r选项

怎么了

 for input_file in $(grep -v "^#" inputflist.txt); do echo $input_file done 

或干脆

 grep -v "^#" inputflist.txt