我的代码:
#!/bin/bash
x=${#}
for (( a=0; a<x; ++a)); do
if [[ $1 -eq $1 ]] 2> /dev/null
then
variable[a]=${1}
shift
else
echo "The argument $1 is NOT an integer. Aborting this"
exit 1
fi
done
TOTAL=0
for (( a=0; a<x; ++a)); do
echo "TOTAL : ${TOTAL}"
TOTAL=$((TOTAL+variable[a]))
done
echo "Everything accounted to $TOTAL"
exit 0
所以基本上它采用脚本的论点并对它们进行总结。如果参数之一不是整数,它应该告诉您并退出脚本。
现在的情况是,它不会告诉我其中一个参数是否不是整数,它只是跳过它。因此,给它参数 123 123 123 asdt,我得到以下结果:
vagrant@localhost vagrant]$./super.sh 123 123 123 asdt
TOTAL : 0
TOTAL : 123
TOTAL : 246
TOTAL : 369
Everything accounted to 369
[07:43----------------------------------------
vagrant@localhost vagrant]$
但如果我把它改成这样:
for (( a=0; a<x; ++a)); do
if [ $1 -eq $1 ] 2> /dev/null
then
它有效,我得到了这个:
vagrant@localhost vagrant]$./super.sh 123 123 123 asdt
The argument asdt is NOT an integer. Aborting this
[07:44----------------------------------------
vagrant@localhost vagrant]$
为什么会发生这种情况?
答案1
这是 Bash 的特别之处之一[[ .. ]]
。[[ a -eq b ]]
强制a
和b
被视为算术表达式,并且在其中,字符串被视为变量的名称。其他表达式也适用,因此您可以这样做:
$ a=2
$ [[ a -eq 1+1 ]] && echo yes
yes
另一方面,[
是一个普通命令,并且遵循与普通命令相同的语法。它甚至可以作为外部二进制文件来实现。在这里,[
只会看到a
,并抱怨它不是真正的整数。
$ [ a -eq 2 ] && echo yes
bash: [: a: integer expression expected
$ /usr/bin/[ a -eq 2 ] && echo yes
/usr/bin/[: invalid integer ‘a’
只需使用类似的东西
a=asdf
if [[ $a = *[^0-9]* ]]; then
echo "'$a' isn't an integer"
fi
或者
a=asdf
case "$a" in
*[^0-9]*) echo "'$a' isn't an integer";;
esac
显然,和中ksh
的算术评估是否有效。a
1+1
[ a -eq 1+1 ]