当使用 -eq 比较字符串时,if 语句适用于

当使用 -eq 比较字符串时,if 语句适用于

我的代码:

#!/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 ]]强制ab被视为算术表达式,并且在其中,字符串被视为变量的名称。其他表达式也适用,因此您可以这样做:

$ 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的算术评估是否有效。a1+1[ a -eq 1+1 ]

相关内容