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
IFSem 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
}