简单bash行中的Bracket缺失错误?

时间:2017-04-04 23:44:23

标签: linux bash

我的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

他们有什么问题?

2 个答案:

答案 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的回答中建议。但你不能在括号内使用管道。