"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==> 더 많은 매개변수가 전달되는 동안(이것이 변경되는 이유는 Shift 때문입니다)

일을 까다롭게 만드는 것은 shiftwhile 루프의 본문 내에 있습니다.

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

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

$1==> a이것이 첫 번째 매개변수임을 나타냅니다.

now 를 호출하면 shift이제 a매개변수 목록이 사라지고 이제 매개변수 목록 이 b표시 됩니다 . c따라서 지금 호출하면 이제 목록의 첫 번째 매개변수가 됩니다. 매개변수 목록을 한 번 더 호출하면 이제 가 되므로 이제 가 됩니다 . 한 번 더 호출하면 매개변수 목록이 비어 있으므로 while 조건은 성공하지 못하며(이제 크기가 0이므로 매개변수 목록이 더 이상 0보다 크지 않으면) while 루프가 종료됩니다.$1bshiftc$1cshift

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

스크립트에 전달된 매개변수 수에 관계없이 스크립트에서 미리 알지 못하는 유연성을 제공하며, 이에 관계없이 while 루프 내에서 하나씩 반복하여 현재 매개변수를 참조하므로 항상 현재 매개변수가 $1매개변수의 헤드를 의미합니다. 매개변수 목록. ing을 수행 하면 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-line 인수와 stdin. while매개변수 배열에 적어도 하나의 인수가 저장되어 있는 동안에 만 루프를 실행하여 이를 확인합니다. 확인하는 모든 인수를 삭제하므로 $YOUR_CHK어떤 방식으로든 가치 있다고 생각하는 정보를 저장하는 부분이 있어야 합니다.

_fn내용이 스크립트의 본문이거나 쉘 함수의 형태인 경우에도 동일하게 작동합니다.

_fn핸들 stdin- 이 경우 명령줄에 전달된 모든 항목에 위치 매개변수 셸 배열을 지정 하여 첫 번째 줄의 "arg2" echo- 또는 모든 항목을 통해 뱉어냅니다 .|pipeset$@"$@"cat$(comand substitution)

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

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

$YOUR_CHKnull-op입니다. 이는 쉘이 코드를 실행하기 전에는 아무 것도 평가하지 않는 설정되지 않은 변수입니다.

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

arg1 arg2

그러나 shift처음 이후에는 다음과 같습니다.

arg2

그리고 shift마지막 시간 이후에는 다음과 같습니다:

따라서 이것은 우리를 다시 돌아오게 합니다 ${1+:} false. 이제 설정이 해제되었기 때문에 $1쉘은 대체되지 않고 :true대신 false평가만 되어 while루프를 중단하고 종료됩니다._fn().

관련 정보