for 루프에서 매개변수 값을 사용하는 방법

for 루프에서 매개변수 값을 사용하는 방법

스크립트를 실행 중입니다.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 $z1)로 확장한 다음 쉘이 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에서는 그 안에 변수를 지원하지 않습니다.3seqfor{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

관련 정보