저는 유닉스/리눅스를 처음 접했습니다. 나는 나보다 먼저 개발자의 코드를 이해하려고 노력하고 있습니다. 누군가 이 줄이 무엇을 의미하는지 말해 줄 수 있나요 if [ $# -lt 2 ]
?
답변1
Bash에서는 $#
설정된 위치 매개변수의 수로 확장됩니다.
if [ $a -lt $b ]
a 값이 b 값보다 작은 경우를 의미합니다.
if [ $# -lt 2 ]
위치 매개변수 세트의 개수가 2개 미만인지 여부를 의미합니다.
실제 예제에서는 아마도 함수에 주어진 매개변수를 계산하기 위해 이것을 사용할 것입니다. 함수를 다음과 같이 정의하면:
count_words(){
if [ $# -lt 2 ]
then
echo "There are less than two words."
else
echo "There are 2 or more words."
fi
}
그런 다음 다른 수의 단어로 함수를 호출하면 결과는 다음과 같습니다.
$ count_words hello
There are less than two words.
$ count_words how many words
There are two or more words.
$ count_words
There are less than two words.
$ count_words two words
There are two or more words.
답변2
이는 다음 세 가지로 구성됩니다.
$#
스크립트나 함수에 대한 위치 인수의 개수를 포함하는 쉘 변수입니다.[
는 특수 구문이 아니라 프로그램 이름입니다. 의 별칭입니다test
. (체크아웃man [
또는man test
.)의 명령줄은
[
표현식으로 구문 분석됩니다. , , 및 인수 (단지 시각적 구분 기호임)를 사용하여[ $# -lt 2 ]
호출합니다 . 표현식이 true로 평가되면(즉, 스크립트에 대한 인수 수가 2보다 작은 경우) 로 설정되는 성공적인 종료 코드를 반환하고, 그렇지 않으면 실패한 종료 코드를 로 설정합니다 . 다음을 입력하면 이를 확인할 수 있습니다.[
$#
-lt
2
]
$?
0
$?
1
[ 1 -lt 2 ]; echo $? # 1 < 2 is true: 0 [ 2 -lt 1 ]; echo $? # 2 < 1 is false: 1
if condition; then body; fi
명령을 평가condition
하고 성공적인 종료 코드를 반환하면 의 명령 평가를 진행합니다body
.
발생할 수 있는 몇 가지 사항에 주목할 가치가 있습니다.
유틸리티
true
는 항상 성공적인 종료 코드를 반환하고false
항상 실패를 반환하므로 다음과 같은 조건에서 사용할 수 있습니다.while true; do … done
if [ $foo = "yes" ]
$foo
빈 문자열([ = yes ]
) 또는 공백이 포함된 문자열( )로 확장되면 작동하지 않습니다[ no thanks = yes ]
. 따라서 다음과 같은 내용을 자주 보게 됩니다.if [ "x$foo" = "xyes" ]
따라서 의 첫 번째 피연산자로
[
단일 인수를 받습니다 .xno thanks
=
[[
…]]
껍질이다예어(아님내장), 위의 제한 사항을 해결하기 위한 특수 구문 분석 규칙이 있으며 추가 기능을 제공할 수 있습니다.