Meu código:
#!/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
Então, basicamente, ele pega os argumentos do script e os resume. Se um dos argumentos não for um número inteiro, ele deverá informar e sair do script.
Do jeito que está agora, não me diz se um dos argumentos não é um número inteiro, apenas o ignora. Então, dando os argumentos 123 123 123 asdt, recebo o seguinte:
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]$
Mas se eu mudar para isso:
for (( a=0; a<x; ++a)); do
if [ $1 -eq $1 ] 2> /dev/null
then
Funciona e eu recebo isso:
vagrant@localhost vagrant]$./super.sh 123 123 123 asdt
The argument asdt is NOT an integer. Aborting this
[07:44----------------------------------------
vagrant@localhost vagrant]$
Por que isso acontece?
É uma das coisas que
[[ .. ]]
há de especial no Bash.[[ a -eq b ]]
forçasa
eb
para serem tomadas como expressões aritméticas, e dentro de uma, uma string é tomada como o nome de uma variável. Outras expressões também funcionam, então você pode fazer isso:Por outro lado,
[
é um comando comum e obedece à mesma sintaxe dos comandos normais. Pode até ser implementado como um binário externo. Aqui,[
apenas veremosa
e reclamaremos que não é realmente um número inteiro.Basta usar algo como
ou
Aparentemente,
ksh
faz a avaliação aritmética dea
e1+1
até mesmo em[ a -eq 1+1 ]
.