Shell脚本while循环:[围绕管道丢失`]'

Kiw*_*Cam 4 linux scripting shell-script

我尝试使用的 shell 脚本不断出现此错误:

$ ./script.sh: line 2: [: missing `]' 
grep: ]: No such file or directory
Run Code Online (Sandbox Code Playgroud)

该行是尝试检查特定进程是否将锁定文件的部分的一部分:

COUNTER=0
while [ ps aux | grep "[r]elayevent.sh" ] && [ "$COUNTER" -lt 10 ]; do
    sleep 3
    let COUNTER+=1
done
Run Code Online (Sandbox Code Playgroud)

显然,我已经检查过括号是否都正确配对 - 这对我来说看起来不错。此外,条件问题周围的常见空白也不适用。

我在这里缺少什么?

Prv*_*dav 7

错误是您应该先删除,[因为您要检查退出状态然后直接使用命令。

Shellcheck 工具的 Wiki 页面对此有一个解释(问题 SC1014):

[ .. ]不是 shell 语法的一部分,如if语句。它不等同于 C 类语言中的括号,if (foo) { bar; },并且不应将命令包裹在测试中。

[只是常规命令,例如whoamigrep,但有一个有趣的名称(请参阅 参考资料ls -l /bin/[)。它是 的简写test

如果要查看某个命令的退出状态,直接使用该命令即可。

如果要检查命令的输出,请使用"$(..)"获取其输出,然后使用test[/[[进行字符串比较:

还可以使用,ps aux | grep -q "[r]elayevent.sh"以便您可以静默地获得退出状态,而不是将任何内容打印到stdout.

或者您可以使用pgrep并将其输出定向到/dev/null.

首先使用第二个条件,因为它对于最后一种情况会更有效。

所以最终的脚本将是这样的:

#!/bin/bash
COUNTER=0

while [ "$COUNTER" -lt 10 ] && ps aux | grep -q "[r]elayevent.sh"   ; do

    sleep 3

    let COUNTER+=1

done
Run Code Online (Sandbox Code Playgroud)

或者

#!/bin/bash
COUNTER=0

while [ "$COUNTER" -lt 10 ] && pgrep  "[r]elayevent.sh" >/dev/null  ; do

    sleep 3

    let COUNTER+=1

done
Run Code Online (Sandbox Code Playgroud)

  • 您可能还想在调用 `grep` 时添加 `-q`。否则,它会打印匹配的行。 (4认同)