Bash: 정의되지 않은 변수당 하나의 인수

Bash: 정의되지 않은 변수당 하나의 인수

파일을 생성한다고 가정해 보겠습니다 ~/myScript.sh.

#!/bin/sh

for myVar; do
    echo "Hi"
done

인수 없이 실행 하면 bash myScript아무것도 얻지 못하지만, 하나 이상의 인수를 사용하여 실행하면 이러한 변수의 수에 따라 출력을 얻습니다 (변수는 전달된 인수에 스크립트를 종속시키는 것으로 보입니다) .

bash ~/myScript.sh arg0 arg1

정의되지 않은 변수를 기반으로 하는 for 루프는 및 자체에 myVar적용되며 (잘못 표현된 경우 죄송합니다) 다음과 같은 출력을 얻습니다.arg0arg1

안녕하세요

안녕하세요

(매개변수당 하나의 "hi")


처음에는 루프가 하나의 매개변수로 작동한다고 가정했습니다 . 따라서 and for가 있고 and 가 있으면 and 가 작동 하지만 추가 테스트를 해보니 틀렸습니다. 모든 루프는 모든 매개변수로 작동합니다.myVar_0myVar_1arg0arg1myVar_0arg_0myVar_1arg1for

#!/bin/sh

for myVar_0; do
    echo "Hi"
done

for myVar_1; do
    echo "Hello"
done

반환됩니다 bash myScript arg0 arg1:

안녕하세요

안녕하세요

안녕하세요

안녕하세요

참고 사항: "for 루프당 1개의 인수"를 원한다면 로컬 범위에서 Bash 함수를 사용해야 한다고 가정합니다.

내 질문

Bash와 일치하는 "모든 for 루프의 모든 매개변수"의 이름은 무엇입니까?

답변1

myVar위치 인수를 사용하여 스크립트를 호출하는 경우 정의되지 않습니다. 남자 배쉬에서 :

For the name [ [ in [ word... ] ] ] list of things to do; done
[...] in 단어가 생략되면 for 명령은 각 위치 매개변수 세트에 대해 목록을 한 번 실행합니다.

하지만 당신은 그것을 사용하지 않습니다 $myVar.

for myVar; do
    echo "$myVar"
done

답변2

Bash/POSIX 셸의 루프는 Python의 루프 for와 유사합니다 for. 루프 변수는 나열된 값을 하나씩 가져오고 루프 본문은 각 값에 대해 한 번 실행됩니다.

그래서 이거:

for x in foo bar; do
    echo "$x"
done
echo finally x is "$x" 

비슷하다

x=foo        # assign value
echo "$x"    # loop body
x=bar        # same with the second value...
echo "$x"
echo finally x is "$x"   # this isn't part of the loop body

루프 본문을 반복할 필요가 없다는 것뿐입니다. 배열 변수가 있는 경우 A배열 for x in "${A[@]}"; do...값을 반복합니다. for x in "$@"; do...위치 매개변수, 즉 명령줄 매개변수 는 "$@"확장 내용 이므로 유사하게 반복됩니다. 기본적으로 for x; do는 그냥 약어임for x in "$@"; do

따라서 이것은 모든 명령줄 인수를 인쇄합니다.

x에 대해 #또는:"$@"의 x에 대해;
    printf "%s\n" "$x"
완벽한

인덱스로 매개변수에 직접 접근하려면 $1첫 번째 매개변수, $2두 번째 매개변수 등을 사용하세요.

printf "the first arg is %s and the second is %s\n" "$1" "$2"

관련 정보