这是我的脚本:
echo "please enter any number"
read n
a= $(($n % 2))
if [ $a -eq 0 ]; then
echo "EVEN"
else
echo "ODD"
fi
这是脚本的输出:
$ source first.sh
please enter any number
2
0: command not found
ODD
就像我给出的任何值都只有其他部分会被执行。
这里错误的原因可能是什么?
答案1
问题在于 后面的空格a=
。变量赋值应该是a=$(($n % 2))
。
一般来说,空格在 Bash 脚本中很重要。如所述cas 的回答在这个相关的Unix 和 Linux 问题(我认为值得一看):
没有被空格分隔的内容被视为一个“单词”。
由一个或多个空格字符分隔的内容被视为两个(或更多)单词。
这具有有趣的含义,即如果将变量赋值写为a=$(($n % 2))
,则紧挨着的值=
,即,将按预期$(($n % 2))
分配给。a
但是,如果变量赋值写为 ,a= $(($n % 2))
则 旁边的值=
只是一个空格,它将被分配给a
。 Bash 将a
视为环境变量将其设置为空字符串的值,然后继续计算$(($n % 2))
,根据 的值,结果n
为0
或。这就是为什么您会根据情况得到或 的1
错误。0: command not found
1: command not found
之后,脚本将继续执行该语句。由于值为空字符串,if-else
表达式始终返回以下错误(您的问题中未显示):[ $a -eq 0 ]
a
[: -eq: unary operator expected
因此,最后该else
部分将始终得到执行,因此您的脚本将始终返回ODD
。
答案2
Bash 有自己的有用选项来确定发生了什么。-v 将每行回显为已读,-x 打印出执行的行(在变量替换等之后)
$ bash -vx first.sh
bash -vx first.sh
echo "please enter any number"
+ echo 'please enter any number'
please enter any number
read n
+ read n
4
a= $(($n % 2))
+ a= <======As a comment mentioned, a space causes problems
+ 0
first.sh: line 3: 0: command not found
if [ $a -eq 0 ]; then
echo "EVEN"
else
echo "ODD"
fi
+ '[' -eq 0 ']'
first.sh: line 4: [: -eq: unary operator expected
+ echo ODD
ODD