bash:找不到命令



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命令中看到四种主要条件:

  1. [ ... ]- []看起来像某种括号,但是[实际上是test命令的同义词,并将其参数评估为条件表达式。不理解其他[ ]对作为括号,而是必须使用( )。但是,由于这是一个命令,因此其所有论点都在交给命令之前,要经过通常的外壳解析,因此您必须像( ... )一样逃脱它们,这很烦人。而且您不能使用&&,因为将命令分开,您必须使用-a

    还有很多其他解析的奇数,例如使用<>,您必须逃脱它们,或者它将它们视为输入/输出重定向。认真地说,如果您使用if [ 3 > 5 ],它将创建一个名为" 5"的文件,然后将命令[ 3 ]的输出转移到其中。BTW [ 3 ]不会输出任何内容,但是它确实返回成功(即true),因为" 3"不是空白...

    基本上,您不应使用[ ... ],除非您需要与不支持任何更好选项的通用外壳兼容。

  2. [[ ... ]]-这是一个bash条件表达式,基本上是清理的[ ... ](又称test)的清理版本,删除了奇怪的解析奇数,并添加了一些很酷的附加功能。您可以使用括号(而非支架)进行分组,而<>进行比较,所有这些都没有逃脱。如果您使用的是bash(不是通用外壳),则通常是要走的路。但是它不做数学(全部以字符串为导向),除非您强制使用$(( ))对某些东西进行算术评估(如Broslow的答案中)。

    和警告:在[[ ... ]]中,=!=<> do string 比较,而不是算术。例如,[[ 05 = 5 ]]是错误的,因为它们在文本上并不相等。[[ 10 > 5 ]]也是错误的,因为" 1"是按字母顺序的(嗯,按标准排序顺序)。如果您需要在此处进行算术比较,则需要使用-eq-ne-lt-gt

  3. (( ... ))-这是算术表达式。类似于[[ ]],除了内容被评估为数学表达式而不是面向字符串的测试。请注意,在数学上下文中,变量会自动评估,因此您可以使用i而不是$i。另外,=是一个分配,而==是一个比较(在[[ ... ]]中,它们都是比较)。

    这与我在上一项中提到的$(( ... ))的内容令人困惑。不同之处在于,(( ... ))单独采用整个命令,而$(( ... ))评估了内容并返回将包含在其他命令中的结果。例如,echo $((3+5))将对echo 8进行评估,然后打印" 8"。

  4. 其他一些命令。您可以在if语句中使用所需的任何命令作为测试,并且if将根据命令是成功还是失败,将执行thenelse分支。您会看到if grep somepattern somefile; then...if somecommand; then echo "it worked"; else echo "it failed"; fi之类的东西。其他三个选项实际上只是特殊情况:您可以使用[ ...][[ ... ]](( ... ))在Bash中使用任何其他命令的任何地方,它们恰好是if条件。

    <</p>

您不能将括号内的括号内嵌套括号内嵌套。因此,[[ ]]是很好的[ ],但[ [ ] ]不是(假设嵌套的支架是操作员)。如果您想要一些数学,可以做$((math))

应该是

if [[ $((i % 3)) == 0 && $((i % 5)) == 0 ]] 

也请参见

bash中的参数过多

您不能在[和下一个[之间拥有空间。将[ [更改为[[。与] ]

参见bash中的条件表达式。

相关内容

  • 没有找到相关文章

最新更新