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