스크립트를 실행 중입니다.script.sh 12345 12346 12347
for z in 1..$(seq 1 $#);
do
echo "param $z is $($(echo $z))"; //Line 4
done;
출력은 다음과 같을 것으로 예상됩니다.
param 1 is 12345
param 2 is 12346
param 3 is 12347
4번째 줄에서 뭔가 빠진 것 같아요.
답변1
문제는 $($(echo $z))
먼저 $(1)
(if $z
1)로 확장한 다음 쉘이 1
이를 명령으로 실행하려고 한다는 것입니다.
가정 bash
:
params=( "$@" )
for (( i = 0; i < ${#params[@]}; ++i )); do
printf 'Param %d is "%s"\n' "$i" "${params[i]}"
done
실행하세요:
$ bash script.sh a b c
Param 0 is "a"
Param 1 is "b"
Param 2 is "c"
또는 다음을 사용하여 /bin/sh
:
i=0
while [ "$#" -gt 0 ]; do
printf 'Param %d is "%s"\n' "$i" "$1"
i=$(( i + 1 ))
shift
done
달리다:
$ /bin/sh script.sh a b c
Param 0 is "a"
Param 1 is "b"
Param 2 is "c"
명시적으로 열거해야 하는 경우가 그렇습니다. 일반적으로 우리는 반복합니다 "$@"
:
for param in "$@"; do
printf 'Param: "%s"\n' "$param"
# do other thing with "$param" here
done
답변2
for z in 1..$(seq 1 $#);
세 개의 매개변수의 경우 이는 1..1
, 2
, 로 확장됩니다. 이미 숫자를 다른 단어로 인쇄하고 있으며 실제로 숫자 목록을 생성할 수 없습니다. 중괄호 확장은 숫자 목록을 생성할 수 있으며 구문은 동일하지만 Bash에서는 그 안에 변수를 지원하지 않습니다.3
seq
for
{1..3}
따라서 이것은 다음과 같이 쓸 수 있습니다.
for z in $(seq $#) ; do ... # or
for (( z=1 ; z <= $# ; z++ )) ; do ...
또는 ksh 또는 zsh에서 중괄호를 사용하십시오.
for z in {1..$#} ; do ...
변수를 간접적으로 참조하려면 ${!var}
Bash에서 var
저장할 위치를 사용할 수 있습니다.이름변수, 예를 들어
echo "param number $z is ${!z}"
또는 슬라이스 표기법을 사용할 수 있습니다 $@
(Bash/ksh/zsh에서 작동해야 함).
echo "param number $z is ${@:z:1}"
그러나 실제로 for x in "$@"
는 값을 반복하는 것이 더 관용적으로 간주될 수 있습니다. 숫자를 추가하는 것도 매우 간단하며 쉘 관련 기능이 필요하지 않습니다.
i=1
for x in "$@" ; do
echo "param $i is $x"
i=$((i+1))
done