这个 bash 脚本中的 if 语句有什么错误?

这个 bash 脚本中的 if 语句有什么错误?

以下 shell 脚本有什么问题?我得到了

[: too many arguments

错误

#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
    #something
fi

答案1

首先,该[命令仅进行比较。您必须单独执行计算。例如:

var1mod=$((var1 % 2))
if [ $var1mod -eq 0 ]; then

但是,由于您似乎正在为 bash 编写脚本,因此您可以使用不同的命令并避免额外的步骤:

if (( var1 % 2 == 0 )); then

其次,您不能使用 链接命令-a。这只能作为 的参数[。但在它之外,您必须使用&&

三种不同的变体:

if [ $var1mod -eq 0 -a $var2mod -eq 0 ]; then
if [ $var1mod -eq 0 ] && [ $var2mod -eq 0 ]; then
if (( var1 % 2 == 0 )) && (( var2 % 2 == 0 )); then
if (( var1 % 2 == 0 && var2 % 2 == 0 )); then

永远记住,的语法if很简单。这意味着in只是一个命令的名称,就像或 一样。if command; then command; fi[if [lsecho

答案2

您似乎将条件求值与算术求值混淆了。%是算术求值中的运算符,而不是条件求值中的运算符。请参阅bash(1)手册页部分以了解这些主题。[...]用于条件求值,而((...))用于算术求值。

更不用说你的 shebang 行是错误的,除非由于某种原因你在启动驱动器的根级别安装了 bash 的副本。

最后但并非最不重要的一点是,换行符与分号相同。在 shell 脚本中,您不需要用分号结束一行。分号的存在只是为了让您在一行中放置两个语句。

这是脚本的清理版本:

/bin/bash #!/bin/bash

VAR1=10
VAR2=20
如果 (( (VAR1 % 2 == 0) && (VAR2 % 5 == 0) )); 然后
    :#something (冒号无操作)

相关内容