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)
显然,我已经检查过括号是否都正确配对 - 这对我来说看起来不错。此外,条件问题周围的常见空白也不适用。
我在这里缺少什么?
错误是您应该先删除,[因为您要检查退出状态然后直接使用命令。
Shellcheck 工具的 Wiki 页面对此有一个解释(问题 SC1014):
[ .. ]不是 shell 语法的一部分,如if语句。它不等同于 C 类语言中的括号,if (foo) { bar; },并且不应将命令包裹在测试中。
[只是常规命令,例如whoami或grep,但有一个有趣的名称(请参阅 参考资料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)