여기서 Bash builtin true
과 좀 더 구체적으로 말하면 Bash가 대괄호 안의 표현식을 확장하고 해석하는 방법 에 대한 오해가있는 것 같습니다 .
miku의 답변 에있는 코드 는 Bash builtin true
, 또는 /bin/true
다른 맛의 true
명령 과 전혀 관련이 없습니다 . 이 경우 true
단순한 문자열에 지나지 true
않으며, 변수 할당이나 조건식의 평가로도 명령 / 내장을 호출하지 않습니다 .
다음 코드는 기능적으로 miku의 답변 코드와 동일합니다.
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
여기서 유일한 차이점은 비교되는 4 개의 문자가 't', 'r', 'u'및 'e'대신 'y', 'e', 'a'및 'h'라는 것입니다. 그게 다야. yeah
Bash가 token을 구문 분석 할 때 이름이 지정된 명령이나 내장을 호출하거나 (miku의 예에서는) 특별한 처리가 진행되지 않습니다 true
. 그것은 단지 문자열이며 완전히 임의적입니다.
업데이트 (2014-02-19) : miku의 답변에있는 링크를 따라 가면 혼란의 근원이 어디인지 알 수 있습니다. Miku의 답변은 단일 괄호를 사용하지만 그가 연결하는 코드 스 니펫은 괄호를 사용하지 않습니다. 그냥 :
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
두 코드 스 니펫은 동일한 방식으로 작동 하지만 괄호는 후드 아래에서 진행되는 작업을 완전히 변경합니다.
Bash가 각 경우에 수행하는 작업은 다음과 같습니다.
괄호 없음 :
- 변수
$the_world_is_flat
를 문자열로 확장하십시오 "true"
.
- 문자열
"true"
을 명령 으로 구문 분석하십시오 .
true
명령을 찾아 실행하십시오 (내장 또는 /bin/true
Bash 버전에 따라).
true
명령 의 종료 코드 (항상 0 임)를 0과 비교하십시오. 대부분의 쉘에서 종료 코드 0은 성공을 나타내며 다른 것은 실패를 나타냅니다.
- 종료 코드가 0 (성공)이므로
if
명령문의 then
절을 실행하십시오 .
브래킷 :
- 변수
$the_world_is_flat
를 문자열로 확장하십시오 "true"
.
- 이제 완전히 확장 된 조건식을 구문 분석하십시오 (이 형식은)
string1 = string2
. =
연산자는 bash는의이다 문자열 비교 연산자입니다. 그래서...
"true"
및 에서 문자열 비교를 수행하십시오 "true"
.
- 그러나 두 문자열은 동일하므로 조건부 값이 참입니다.
if
명령문의 then
절을 실행하십시오 .
true
명령이 성공을 나타내는 종료 코드 0을 리턴 하므로 대괄호 없음 코드가 작동합니다 . 의 값이 의 오른쪽에있는 $the_world_is_flat
문자열 리터럴과 동일 하므로 대괄호 코드가 작동 true
합니다 =
.
포인트를 집으로 몰아 가려면 다음 두 코드 조각을 고려하십시오.
이 코드 (루트 권한으로 실행되는 경우)는 컴퓨터를 재부팅합니다.
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
이 코드는 "Nice try"를 출력합니다. 재부팅 명령이 호출되지 않습니다.
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
업데이트 (2014-04-14)=
와 ==
AFAIK 의 차이점에 대한 의견의 질문에 대답하면 차이 가 없습니다. ==
운영자를위한 Bash 전용의 동의어 =
, 그리고 지금까지 내가 본대로, 그들은 모든 상황에서 정확히 같은 작동합니다.
그러나 특히 테스트 또는 테스트에 사용되는 =
및 ==
문자열 비교 연산자 에 대해 이야기 하고 있습니다 . 나는 그 제안 아니에요 과 교환 할 수있다 사방 bash는.[ ]
[[ ]]
=
==
예를 들어, 당신은 분명히에 변수 할당 할 수없는 ==
등, var=="foo"
물론 기술적으로는 ( 수 이렇게, 그러나의 값이 var
될 것입니다 "=foo"
배쉬가 표시되지 않기 때문에, ==
여기 연산자를, 그것은 보는 것 =
다음에, (할당) 연산자를 리터럴 값 ="foo"
은 단지)가됩니다 "=foo"
.
하지만 또한, =
및 ==
상호 교환이 테스트 작업 방법, 당신이 있다는 사실을 숙지 않습니다 당신이 내부에 그것을 사용하고 있는지에 따라 [ ]
또는 [[ ]]
,도에 피연산자가 인용 여부. Advanced Bash Scripting Guide : 7.3 Other Comparison Operators 에서 자세한 내용을 읽을 수 있습니다 ( =
및 의 토론으로 스크롤 ==
).
true
그리고false
아래의 대부분의 스 니펫과 관련 하여 , 문자열이 아닌 일반 문자열입니다bash built-ins
!!! 아래의 Mike Holt의 답변을 읽으십시오. (이것은 높게 투표되고 받아 들여진 답변이 IMHO 혼란스럽고 덜 투표 된 답변에 통찰력있는 내용을