我的代码:
#!/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]$
为什么会这样?
这
[[ .. ]]
是 Bash 的特别之处之一。[[ a -eq b ]]
forcesa
和b
作为算术表达式,其中一个字符串作为变量名。其他表达式也适用,因此您可以这样做:另一方面,
[
是普通命令,遵循与普通命令相同的语法。它甚至可以作为外部二进制文件实现。在这里,[
只会看到a
,并抱怨它不是真正的整数。只需使用类似的东西
或者
显然,
ksh
算术评估a
甚至1+1
在[ a -eq 1+1 ]
.