함수를 만들려고 하는데 좋은 예제를 찾았다고 생각하지만 그 뒤에 숨어 있는 논리를 모두 이해하지 못합니다.
좀 더 구체적으로 말하면, "while" 줄에서 누군가 테스트가 무엇인지, 무엇을 하는지 설명해 줄 수 있나요? $#은 무엇이며(# 주석 문자가 아닌가요?) -gt 0 매개변수는 어디에서 왔습니까? while 매뉴얼 페이지에서 찾을 수 없습니다.
예는 다음과 같습니다.
function my_function()
{
while test $# -gt 0
do
$
echo "$1"
shift
done
}
감사해요.
답변1
#
그 자체로는 분명히 주석이지만 함수 $#
에 전달된 인수의 수를 포함합니다.
test
한 숫자가 다른 숫자보다 큰지 여부와 같은 다양한 테스트를 수행할 수 있는 프로그램입니다(연산자가 이면 -gt
다른 연산자가 많이 있으므로 참조 man test
). 테스트가 성공하면(이 경우 the number of parameters
IS가 0보다 크면) 성공을 반환합니다.
이 shift
명령은 첫 번째 인수를 삭제합니다. 또한 감소$#
전체 코드는 다음과 같이 생각할 수 있습니다. 인수를 사용하여 작업을 수행한 다음(이 경우 화면에 표시) 인수가 더 이상 남지 않을 때까지 반복합니다.
디버깅에 유용한 나머지 매개변수를 모두 보려면 다음을 확인하세요.$@
답변2
$#
==> 스크립트 매개변수 전달
test
==>조건부 평가 명령
-gt
==>대표보다 낫다
test a -gt b
==> a가 b보다 크면 true, 그렇지 않으면 false
함께 넣어보세요:
while test $# -gt 0
==> 더 많은 매개변수가 전달될 때(교대 때문에 변경됨)
상황이 까다로워지는 부분은 shift
while 루프 본문 내부입니다.
$1
==>는 항상 첫 번째 매개변수를 나타냅니다.
a
이를 보다 구체적으로 만들기 위해 매개변수 및 b
을 전달한다고 가정합니다 c
.
$1
==>는 a
이것이 첫 번째 매개변수임을 의미합니다.
지금 호출하면 shift
이제 a
매개변수 목록이 존재하므로 b
지금 호출 c
하면 이제 목록의 첫 번째 매개변수가 됩니다. 이제 매개변수 목록을 다시 호출하여 지금 상태로 만드세요 . 다시 호출하면 매개변수 목록이 비어 있게 되므로 while 조건이 성공하지 못하고(매개변수 목록이 더 이상 0보다 크지 않고 크기가 0이므로) while 루프가 종료됩니다.$1
b
shift
c
$1
c
shift
현재 매개변수를 사용 하고 참조하면 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+}
대체하는 쉘의 내장 함수 입니다. 교체 실패가 설정되지 않으면 조건이 평가되고 루프 가 중단됩니다.:true
while
$1
false
while
while
루프가 반복될 때마다 성공하면 _fn() echo
es의 $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().