如何在 shell 脚本中使用 grep 在 while 循环中使用命令的否定?

如何在 shell 脚本中使用 grep 在 while 循环中使用命令的否定?

有什么方法可以同时使用 while 循环和 grep 吗?看我的例子:

while  [[  !(grep -R -h "${text}" ${path}) ]];
do
    ...
done

它说:

./test_script.sh: line 1: conditional binary operator expected
./test_script.sh: line 1: expected `)'
./test_script.sh: line 1: syntax error near `-R'
./test_script.sh: line 1: `while  [[  !(grep -R -h "${text}" ${path}) ]];'

答案1

  1. 不要将命令放在方括号内。要在grep成功时循环(即,直到失败),只需执行以下操作

    while grep ...
    do
    done
    
  2. 要在grep失败时循环(即,直到成功),请执行

    while ! grep ...
    do
    done
    

    !和命令之间有空格(即一个或多个空格和/或制表符) 。

  3. 您应该始终引用您的 shell 变量引用(例如,"$path"),除非您有充分的理由不这样做,并且您确定您知道自己在做什么。相比之下,虽然牙套很重要, 它们不像引号那么重要,所以"$text"和就足够了(在这种情况下"$path"您不需要使用"${text}"和,)。"${path}"

    …除非path可能被设置为列表文件名,在这种情况下,请参阅 忘记在 bash/POSIX shell 中引用变量的安全隐患 — 但是如果……怎么办?

  4. ;行尾不需要分号 ( ) while(除非您在do其后添加分号)。换句话说,whileline 和 thedo必须用分号分隔和/或一个或多个换行符。

相关内容