O problema com $($(echo $z))
é que ele se expande, primeiro para $(1)
(se $z
for 1) e então o shell tenta executar 1
como um comando.
Assumindo bash
:
params=( "$@" )
for (( i = 0; i < ${#params[@]}; ++i )); do
printf 'Param %d is "%s"\n' "$i" "${params[i]}"
done
Executando:
$ bash script.sh a b c
Param 0 is "a"
Param 1 is "b"
Param 2 is "c"
Ou com /bin/sh
:
i=0
while [ "$#" -gt 0 ]; do
printf 'Param %d is "%s"\n' "$i" "$1"
i=$(( i + 1 ))
shift
done
Executando isso:
$ /bin/sh script.sh a b c
Param 0 is "a"
Param 1 is "b"
Param 2 is "c"
Isso se você realmente precisar enumerá-los explicitamente. Normalmente, seria apenas loop "$@"
:
for param in "$@"; do
printf 'Param: "%s"\n' "$param"
# do other thing with "$param" here
done