if fi [:太多的论点

4m1*_*4j1 0 bash arguments if-statement

这个脚本有什么问题吗?

if [ grep -q "#<filter>" /etc/hosts ] &&  [ grep -q "#</filter>" /etc/hosts ] ; then
 echo "exist"
fi
Run Code Online (Sandbox Code Playgroud)

它显示的错误是:

[: too many arguments
Run Code Online (Sandbox Code Playgroud)

Kaz*_*Kaz 6

问题是您在[语法中包装普通命令.这是无效的.该[令牌实际上是一个命令,解释它的参数为做上的文件和目录,如具有类型,生存,时间戳做测试字符串和数值比较,条件非常有限的表达语言.

在shell语法中,您可以在(...)括号中包装一系列命令.这样做的结果是在新的子进程中运行所附的命令.您还可以使用大括号对命令进行分组以创建组命令.

&&||命令具有相同的优先级; 它不像C语言中的类似排序.基本上如果你有一个命令,你可以使用|| another command或使用另一个命令&& another command.该||运营商表示:运行下面的命令,如果一切这里左边失败."这样做,否则如果失败了,就这样做".该&&运营商表示:如果一切成功,到目前为止,还做到以下几点.

如果你想要逻辑(A || B) && (C || D)- 换句话说,A,B,C和D必须在那个序列中运行,并且你希望每个||组中至少有一个命令成功,那么可以用这样的大括号来完成:

{ A || B; } && { C || D; }
Run Code Online (Sandbox Code Playgroud)

或者用括号,如果你不介意花费儿童过程只是为了控制评价.请注意,分组命令语法中需要分号; 否则必须使用换行符,并且大括号周围必须有空格.

没有大括号,A || B && C || D意味着同样的事情A || { B && { C || D; } }:它基本上是正确的,具有相同的优先权.并且,顺便说一句,&操作员(A || B && C || D &后台作业)具有较低的优先级意味着将整个darn事物放在后台,而不仅仅是D.