我的bash脚本中有以下两行:
fail_str=$'Checking...\nChecking...'
if [ tail -1 /home/pi/video_buffer_usage.txt | grep '100% full' ] || [ tail -2 $out_file | grep "$fail_str" ] ; then
给出错误:
./joi_main.sh: line 63: [: missing `]'
grep: ]: No such file or directory
他们有什么问题?
答案 0 :(得分:2)
失去[]
s:
if tail -1 /home/pi/video_buffer_usage.txt | grep '100% full' ||
tail -2 "$out_file" | grep "$fail_str" ; then
(为可读性添加了无害的换行符)
您可能还想要沉默grep
s:
if tail -1 /home/pi/video_buffer_usage.txt | grep -q '100% full' ||
tail -2 "$out_file" | grep -q "$fail_str" ; then
答案 1 :(得分:1)
if
条件是一个命令,如果返回0则表示“true”,否则表示“false”。
在您的情况下,该命令是:
[ tail -1 /home/pi/video_buffer_usage.txt | grep '100% full' ] || [ tail -2 $out_file | grep "$fail_str" ]
现在,让我们关注第一部分:
[ tail -1 /home/pi/video_buffer_usage.txt | grep '100% full' ]
开始括号是一个命令(Bash内置)。此命令读取它提供的参数,并期望最后一个参数,一个结束括号。现在,你可能会想“嘿,我确实提供了一个结束括号”。但是你需要看看像Bash看到的命令。
Bash查看整个命令,查看管道符号,并得出结论要创建由两个命令组成的管道。开始和结束括号不是同一简单命令的一部分。这就是Bash看到的:
{ [ tail -1 /home/pi/video_buffer_usage.txt ; } | { grep '100% full' ] `}
这就是为什么Bash抱怨缺少结束括号。
您不能将管道放在测试语句中。您可以将要测试的字符串存储在变量中(例如,使用命令替换$()
),然后测试字符串,或者您可以删除括号并单独使用命令,如果其返回状态完成工作,在@webb的回答中建议。但你不能在括号内使用管道。