Cada caractere no shell pode ter um significado especial.
O código ${i+1}
não significa "adicionar 1 a i".
Para descobrir o que isso significa, execute este comando:
LESS=+/'\{parameter\:\+word\}' man bash
E leia:
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
E um pouco acima:
Omitting the colon results in a test only for a parameter that is unset.
Como $i
tem um valor definido pelo loop for i in $@;
, o "Valor Alternativo" é substituído e 1
é impresso.
Se você quiser adicionar 1 ao valor dos argumentos, faça o seguinte:
for i
do echo "$((i+1))"
done
Não há necessidade de in "$@"
(e acostume-se a citar todas as expansões).
$ ./test.sh 3 5 8 4
4
6
9
5
Próximo argumento.
Mas isso não é "o próximo argumento" também. A questão central é com o seu loop, você está usando o valor de argumentos em um loop, não um índice para os argumentos. Você precisa fazer um loop sobre um índice i
dos argumentos, não o valor i
de cada argumento. Algo como:
for (( i=1; i<=$#; i++)); do
echo "${i}"
done
Isso imprimirá um índice, como mostra:
$ ./test.sh 3 5 8 4
1
2
3
4
Indirection
Como podemos acessar o argumento na posição $i
?: Com indireto:
for (( i=1; i<=$#; i++)); do
echo "${!i}"
done
Veja o simples !
adicionado?
Agora funciona assim:
$ ./test.sh 3 5 8 4
3
5
8
4
Solução final.
E para imprimir o argumento atual e o próximo, use isto:
for (( i=1; i<=$#; i++)); do
j=$((i+1))
echo "${!i} ${!j}"
done
Não, não há maneira mais simples do que calcular o valor na variável $j
.
$ ./test.sh 3 5 8 4
3 5
5 8
8 4
4
Isso funciona para o texto também:
$ ./test.sh sa jwe yqs ldfgt
sa jwe
jwe yqs
yqs ldfgt
ldfgt