bash中for循环中if语句的语法

时间:2018-03-07 22:20:54

标签: bash grep

for i in $( find . -name 'x.txt' ); do; if [ grep 'vvvv' ]; 
then; grep 'vvvv' -A 2 $i | grep -v vvvv | grep -v '-' >> y.csv; else 
grep 0 $i >> y.csv; fi; done

这可能有什么问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

;之后不允许do

这由http://shellcheck.net/

自动检测到

那就是说,你可能想要的更像是:

while IFS= read -r -d '' i; do
  if grep -q -e vvvv -- "$i"; then
    grep -e 'vvvv' -A 2 -- "$i" | egrep -v -e '(vvvv|-)'
  else
    grep 0 -- "$i"
  fi
done < <(find . -name 'x.txt' -print0) >y.csv

注意:

  • 使用find -print0IFS= read -r -d ''可确保正确处理所有可能的文件名(包括包含空格,换行符等的文件名)。有关此成语的更多背景信息,请参阅BashFAQ #1
  • 如果您希望if grep ...检查if的输出,则应使用
  • grep。使其成为if [ grep ... ]意味着您将grep作为参数传递给test命令,而不是将其作为命令本身运行。
  • 我们只为整个循环打开y.csv 一次,而不是一遍又一遍地重新打开文件,只写一行(或短行数)并关闭它。
  • 如果您不控制这些位置参数,则应使用参数--将选项与位置参数分开。
  • -作为要搜索的字符串传递给grep时,应该以{{1​​}}开头。也就是说,在目前的情况下,我们可以结合两个-e调用,完全避免需要。
  • 扩展始终引用。也就是说,grep -v,而不是"$i"。否则,这些值将在空格上拆分,并且生成的每个部分都将单独计算为glob,从而无法正确处理由这些操作中的任何一个修改的文件名。