bash shell,以下代码段将导致错误:"太多参数"。我已经彻底搜索了,无法到达底部。
if [ [ $i % 3 ] == 0 ] && [ [ $i % 5 == 0 ] ]
我只是在学习bash,任何帮助都非常感谢,谢谢!
解决:如果[[$((i%3))== 0&&$((i%5))== 0]]谢谢@Broslow
您可以使用算术表达式来简化这一点:
if (( i % 3 == 0 && i % 5 == 0 )); then
(甚至更简单,使用(( i % 15 == 0 ))
...)。
让我再解释一下:在Bash中,您会在if
命令中看到四种主要条件:
[ ... ]
-[
和]
看起来像某种括号,但是[
实际上是test
命令的同义词,并将其参数评估为条件表达式。不理解其他[ ]
对作为括号,而是必须使用( )
。但是,由于这是一个命令,因此其所有论点都在交给命令之前,要经过通常的外壳解析,因此您必须像( ... )
一样逃脱它们,这很烦人。而且您不能使用&&
,因为将命令分开,您必须使用-a
。还有很多其他解析的奇数,例如使用
<
或>
,您必须逃脱它们,或者它将它们视为输入/输出重定向。认真地说,如果您使用if [ 3 > 5 ]
,它将创建一个名为" 5"的文件,然后将命令[ 3 ]
的输出转移到其中。BTW[ 3 ]
不会输出任何内容,但是它确实返回成功(即true),因为" 3"不是空白...基本上,您不应使用
[ ... ]
,除非您需要与不支持任何更好选项的通用外壳兼容。[[ ... ]]
-这是一个bash条件表达式,基本上是清理的[ ... ]
(又称test
)的清理版本,删除了奇怪的解析奇数,并添加了一些很酷的附加功能。您可以使用括号(而非支架)进行分组,而<
和>
进行比较,所有这些都没有逃脱。如果您使用的是bash(不是通用外壳),则通常是要走的路。但是它不做数学(全部以字符串为导向),除非您强制使用$(( ))
对某些东西进行算术评估(如Broslow的答案中)。和警告:在
[[ ... ]]
中,=
,!=
,<
和>
do string 比较,而不是算术。例如,[[ 05 = 5 ]]
是错误的,因为它们在文本上并不相等。[[ 10 > 5 ]]
也是错误的,因为" 1"是按字母顺序的(嗯,按标准排序顺序)。如果您需要在此处进行算术比较,则需要使用-eq
,-ne
,-lt
和-gt
。(( ... ))
-这是算术表达式。类似于[[ ]]
,除了内容被评估为数学表达式而不是面向字符串的测试。请注意,在数学上下文中,变量会自动评估,因此您可以使用i
而不是$i
。另外,=
是一个分配,而==
是一个比较(在[[ ... ]]
中,它们都是比较)。这与我在上一项中提到的
$(( ... ))
的内容令人困惑。不同之处在于,(( ... ))
单独采用整个命令,而$(( ... ))
评估了内容并返回将包含在其他命令中的结果。例如,echo $((3+5))
将对echo 8
进行评估,然后打印" 8"。其他一些命令。您可以在
<</p>if
语句中使用所需的任何命令作为测试,并且if
将根据命令是成功还是失败,将执行then
或else
分支。您会看到if grep somepattern somefile; then...
和if somecommand; then echo "it worked"; else echo "it failed"; fi
之类的东西。其他三个选项实际上只是特殊情况:您可以使用[ ...]
,[[ ... ]]
或(( ... ))
在Bash中使用任何其他命令的任何地方,它们恰好是if
条件。
您不能将括号内的括号内嵌套括号内嵌套。因此,[[ ]]
是很好的[ ]
,但[ [ ] ]
不是(假设嵌套的支架是操作员)。如果您想要一些数学,可以做$((math))
应该是
if [[ $((i % 3)) == 0 && $((i % 5)) == 0 ]]
也请参见
bash中的参数过多
您不能在[
和下一个[
之间拥有空间。将[ [
更改为[[
。与] ]
。
参见bash中的条件表达式。