Se você não transmitir argumentos com espaços:
sum() {
[[ -n $2 ]] && echo $(( $(tr ' ' '+' <<<"$@") ))
}
Efeito:
$ sum 1 2 3
6
Explicação:
-
<<<"some string"
alimenta apenas"some string"
como entrada. Pense nisso como um atalho paraecho "some string" |
. Ele é chamado de String aqui . -
"$@"
se expande em todos os parâmetros posicionais, separados por espaços. É equivalente a"$1 $2 ..."
. - Assim,
tr ' ' '+' <<<"$@"
outputs"$1+$2+$3..."
, que é avaliado pelo% externo$(( ))
. -
[[ -n $2 ]]
testa se o segundo parâmetro não está vazio. Você pode substituir[[ -n $2 ]] &&
por[[ -z $2 ]] ||
.
Outra maneira:
sum() {
[[ -n $2 ]] && (IFS=+; echo $(( $* )))
}
Explicação:
-
$*
é igual a$@
, exceto que os parâmetros não são separados por espaços, mas pelo primeiro caractere do Separador de Campo Interno (IFS
) . ComIFS=+
, ele se expande para "$ 1 + $ 2 + ...". Veja Qual é a diferença entre $ * e $ @? - Definimos
IFS
em um subshell (observe os parênteses ao redor) para que o shell principal não seja afetado.IFS
é, por padrão:\t\n
(espaço, tabulação, nova linha). Esta é uma alternativa ao uso de variáveislocal
.
Agora, responda sua pergunta:
Você pode usar um valor padrão para qualquer variável ou parâmetro. Qualquer um:
SUM() {
echo "The sum is $(($1+$2+${3:-0}+${4:-0}+${5:-0}+${6:-0}+${7:-0}+${8:-0}+${9:-0}))" || false
}
Ou:
SUM() {
echo "The sum is $(($1+$2+${3:=0}+${4:=0}+${5:=0}+${6:=0}+${7:=0}+${8:=0}+${9:=0}))" || false
}