我尝试搜索类似的问题,但找不到适合我的代码的问题。我大约 2 周前才开始,所以这可能是因为我无法理解将一个案例的答案迁移到另一个案例。
我有一个代码来查找文件中的所有目录并在每个文件中搜索一个单词输入,然后最终将任何具有非空白输出的文件放入一个文件中。
我一直在使用 grep 行:
g=$(grep -ni "$word" $myfile)
if [ ! -z $g ]; then
echo "the file inside is: $myfile"
fi
我可以把完整的代码贴上来,但是这是错误:
/home/anthony/myscripts/wordturbo3.sh: line 22: [: 17:chemistry: binary operator expected
(对于 word=chemistry,program=wordturbo3.sh)
只有在我使用带有限定符的 grep 命令后,才会出现此错误! -z
。我的答案键对此的写法略有不同:它使用 if-else 命令 ( if -z, else
) 而不是 ( ! -z
),仅表示 if 部分(没有 else)。这似乎要求我的 if 条件-z
具有输出才能起作用(例如 echo“此文件为空”)。
但是,我要查看的文件比示例多得多,并且不想为了完成命令的“else”部分而重复数百次“此文件为空”。因此,我只是想通过! -z
仅对 if 部分使用 ( ) 来规避这一需求。
它完成了我想要的,但它首先吐出了 17 行左右的“预期二元运算符”。
有一个简单的解决方法吗?
提前感谢您的建议。
编辑:哦,我在网上找到了一个建议,用-n
代替 来-z
表示“包含信息”而不是“空”,但这似乎不起作用。当我将 ( ! -z
) 替换为 ( -n
) 时,程序无法运行。
答案1
问题可能是您grep
返回了多个匹配项,并且$g
其中未引用的部分[ ! -z $g ]
正在进行分词。
例如给定
$ cat myfile
foo
bar
Foo
Bar
然后
$ g=$(grep -ni foo myfile)
$ echo $g
1:foo 3:Foo
所以
$ [ ! -z $g ]
bash: [: 1:foo: binary operator expected
错误信息是因为-z
是一元运算符即,它需要一个参数;由于您已经给出了两个参数[
...,]
它期望您使用二元运算符(如-eq
)。
如果引用变量扩展 ie "$g"
,则返回的所有匹配项grep
将被视为单个参数,因此-z
一元测试将起作用:
$ [ ! -z "$g" ] && echo "non empty"
non empty
然而你不需要这些——相反,只要检查退出状态grep 本身:
$ if grep -qi foo myfile; then echo "foo is in myfile"; fi
foo is in myfile
答案2
我明白了。我需要改变:
if [ ! -z $g ]; then
到
if [ ! -z "$g" ]; then
但是,我还不太明白为什么。我会继续在网上寻找,但如果有人有任何想法,我将不胜感激。
谢谢你!