"while test $# -gt 0"은 무엇을 합니까?

"while test $# -gt 0"은 무엇을 합니까?

함수를 만들려고 하는데 좋은 예제를 찾았다고 생각하지만 그 뒤에 숨어 있는 논리를 모두 이해하지 못합니다.

좀 더 구체적으로 말하면, "while" 줄에서 누군가 테스트가 무엇인지, 무엇을 하는지 설명해 줄 수 있나요? $#은 무엇이며(# 주석 문자가 아닌가요?) -gt 0 매개변수는 어디에서 왔습니까? while 매뉴얼 페이지에서 찾을 수 없습니다.

예는 다음과 같습니다.

function my_function()
{
while test $# -gt 0
do
    $
echo "$1"
    shift
done
}

감사해요.

답변1

#그 자체로는 분명히 주석이지만 함수 $#에 전달된 인수의 수를 포함합니다.

test한 숫자가 다른 숫자보다 큰지 여부와 같은 다양한 테스트를 수행할 수 있는 프로그램입니다(연산자가 이면 -gt다른 연산자가 많이 있으므로 참조 man test). 테스트가 성공하면(이 경우 the number of parametersIS가 0보다 크면) 성공을 반환합니다.

shift명령은 첫 번째 인수를 삭제합니다. 또한 감소$#

전체 코드는 다음과 같이 생각할 수 있습니다. 인수를 사용하여 작업을 수행한 다음(이 경우 화면에 표시) 인수가 더 이상 남지 않을 때까지 반복합니다.

디버깅에 유용한 나머지 매개변수를 모두 보려면 다음을 확인하세요.$@

답변2

$#==> 스크립트 매개변수 전달

test==>조건부 평가 명령

-gt==>대표보다 낫다

test a -gt b==> a가 b보다 크면 true, 그렇지 않으면 false

함께 넣어보세요:

while test $# -gt 0==> 더 많은 매개변수가 전달될 때(교대 때문에 변경됨)

상황이 까다로워지는 부분은 shiftwhile 루프 본문 내부입니다.

$1==>는 항상 첫 번째 매개변수를 나타냅니다.

a이를 보다 구체적으로 만들기 위해 매개변수 및 b을 전달한다고 가정합니다 c.

$1==>는 a이것이 첫 번째 매개변수임을 의미합니다.

지금 호출하면 shift이제 a매개변수 목록이 존재하므로 b지금 호출 c하면 이제 목록의 첫 번째 매개변수가 됩니다. 이제 매개변수 목록을 다시 호출하여 지금 상태로 만드세요 . 다시 호출하면 매개변수 목록이 비어 있게 되므로 while 조건이 성공하지 못하고(매개변수 목록이 더 이상 0보다 크지 않고 크기가 0이므로) while 루프가 종료됩니다.$1bshiftc$1cshift

현재 매개변수를 사용 하고 참조하면 shift어떤 이점이 있습니까 $1?

스크립트에 전달된 매개변수 수를 미리 알 수 없고, 어쨌든 while 루프에서 매개변수를 하나씩 반복하면서 항상 현재 매개변수를 참조할 수 있는 유연성을 제공합니다. $1이는 스크립트의 헤드 매개변수를 의미하기 때문입니다. 목록. 결국 shift매개변수 목록은 비어 있게 되므로 무한 루프를 종료하기보다는 while 조건을 사용하여 0보다 큰지 확인하는 것이 중요합니다.

답변3

변수의 의미를 이해하려면 다음 스크립트를 실행하세요. 스크립트를 다른 이름으로 저장 somescript.sh하고 일부 입력 매개변수를 사용하여 스크립트를 호출합니다.

#!/bin/bash
echo "I display the total parameters passed to this script from commandline"
echo $#
echo "I display all the parameter values"
echo "Input: $@"
echo "I display the first parameter value"
echo "$1"

shift 
echo "After shift: $@"

답변4

내 답변 중 일부를 반복하는 것을 용서해 주시면 이것이 유용할 것이라고 생각합니다.

_fn() { set -- "$@" $(cat)
    while ${1+:} false ; do 
        echo "$1" && [ "$1" = "arg2" ] && echo "$1"
        $YOUR_CHK
        shift
    done
}

echo "arg2" | _fn "arg1"

산출

arg1
arg2
arg2

cmd 라인 매개변수를 처리할 수 있으며 매개변수 배열에 하나 이상의 매개변수가 저장되어 있는지 확인하기 위해 루프 stdin만 실행합니다. while검사하는 모든 매개변수를 삭제하므로 $YOUR_CHK가치 있는 정보를 어떻게든 저장하는 것이 그 일부여야 합니다.

_fn내용이 스크립트 본문이거나 셸 함수 형식인 경우 동작은 동일합니다.

_fn처리 stdin- 이 경우 첫 번째 줄의 - 또는 -는 위치 인수 쉘 배열을 명령줄에 전달된 값으로 설정하여 "arg2" echo재정의 |pipe되고 모든 것이 뱉어집니다.set$@"$@"cat$(comand substitution)

while _fn's $1첫 번째 매개변수는 루프 조건을 만족시키기 위해 ${set+}대체하는 쉘의 내장 함수 입니다. 교체 실패가 설정되지 않으면 조건이 평가되고 루프 가 중단됩니다.:truewhile$1falsewhile

while루프가 반복될 때마다 성공하면 _fn() echoes의 $1첫 번째 매개변수 는 다음과 같습니다 &&.echo언제나성공) 문자열과 같은지 [ tests ]확인하고 es가 다시 성공하면 확인합니다.$1"arg2" &&[ test ]_fn() echo$1

$YOUR_CHK작동하지 않습니다. 셸이 코드를 실행하기 전에 null로 평가되는 설정되지 않은 변수입니다.

루프가 반복될 때마다 첫 번째 인수를 while제거 shift합니다 . $1따라서 반복 1에서는 다음 "$@"과 같습니다.

arg1 arg2

하지만 shift처음 이후에는 다음과 같습니다.

arg2

마지막 시간 이후에는 shift다음과 같았습니다.

${1+:} false이제 다시 설정되지 않았기 때문에 $1쉘은 교체되지 않고 평가 :true만 수행되므로 루프가 false중단 되고 종료 됩니다.while_fn().

관련 정보