왼쪽에서 오른쪽으로? 혹은 그 반대로도?
예:
If [! -z "$ foo"] && [$ foo2 -eq 0]; then
echo "something"
fi
어떤 평가를 먼저 해야 할까요?
[! -z "$ foo"]
또는
[$ foo2 -eq 0]
감사해요!
답변1
쉘 스크립트에서 다음과 같이 말합니다.
if [ ! -z "$foo" ] && [ "$foo2" -eq 0 ]; then
echo 'something'
fi
첫 번째 테스트 [ ! -z "$foo" ]
(가급적 작성 [ -n "$foo" ]
)가 먼저 실행됩니다. 두 번째 시험은오직첫 번째 테스트가 성공하면 실행됩니다. 만약에둘 다테스트가 성공합니다. 즉, $foo
값이 null이 아니고 $foo2
산술 값이 0이면 echo
실행됩니다.
이 &&
연산자는 다른 언어의 유사한 연산자처럼 작동합니다. 쉘 구현단락 평가&&
왼쪽이 다음과 같은 경우 오른쪽만 평가됩니다.진짜.
이 특정 if
명령문은 다음과 같이 키워드를 사용하지 않고 작성할 수도 있습니다 if
.
[ ! -z "$foo" ] && [ "$foo2" -eq 0 ] && echo 'something'
if ...; then ...; fi
IMHO를 사용하는 것이 더 명확 하지만 .
다시 말하지만, 이는 echo
다음 경우에만 실행됩니다.둘 다이전 테스트는 성공적이었습니다.
답변2
너무 길어요.
에서 언급했듯이이미 가지고 있는 답변, 정의에 따르면목록 포함쉘 명령 언어에서는 [ ! -z "$foo" ]
먼저 실행된 다음 종료 상태 0 을 반환하는 경우에만 실행됩니다 [ "$foo2" -eq 0 ]
.
Bash에서 명령 실행 순서는 "쉘 명령" 섹션에 지정되어 있습니다.배쉬 참조 매뉴얼. 다음에서는 여기에 제공된 정의가 (편의상 참조 형식이 아니더라도) 그대로 재현될 수 있다고 가정합니다.
Bash 및 기타 POSIX 호환 셸의 경우 보다 공식적인(그러나 사용자 친화적이지 않은) 정의는 "셸 명령 언어" 장(구체적으로 "셸 명령" 및 "셸 구문" 단락)에서 찾을 수 있습니다.오픈 그룹 기본 사양.
코드에서
if [ ! -z "$foo" ] && [ "$foo2" -eq 0 ]; then
echo "something"
fi
우리는if
복합 명령, 하나그리고 목록그리고 세간단한 명령.
조건부 구문의 일반적인 구문 if
은 다음과 같습니다.
if test-commands; then
consequent-commands;
[elif more-test-commands; then
more-consequents;]
[else alternate-consequents;]
fi
종료 상태가 test-commands
0 이면 consequent-commands
이 절이 실행됩니다.
우리 test-commands
절은 시퀀스인 AND 목록입니다.관로로 구분하세요 &&
.
command1 && command2
command2
where 는 종료 상태가 0인 경우 에만 실행됩니다.command1
AND 목록은 왼쪽 연관성으로 수행됩니다. 그러므로:
command1 && command2 && command3
작성된 것처럼 실행합니다(괄호를 의사코드 그룹화 연산자로 사용하고 Bash 언어에서 의미하는 바는 잠시 잊어버리십시오).
(((command1) && command2) && command3)
AND 목록에서
[ ! -z "$foo" ] && [ "$foo2" -eq 0 ]
첫 번째 파이프라인
[ ! -z "$foo" ]
먼저 실행하세요. 두 번째 파이프라인이 성공한 경우에만
[ "$foo2" -eq 0 ]
처형되다. 목록에서 마지막으로 실행된 명령의 종료 상태가 고려되는 상태입니다 if
.
파이프는 제어 연산자 또는 로 |
구분된 하나 이상의 명령 시퀀스 입니다 |&
. 두 파이프라인 모두 단순한 명령일 뿐입니다.
blanks
간단한 명령은 쉘의 제어 연산자 중 하나로 구분된 일련의 단어입니다 . 간단한 명령은 실행 순서 문제를 일으키지 않습니다.
기록에 따르면 AND 목록의 간단한 명령은 (내장) 명령 과 해당 명령의 [
4개 인수 , !
, -z
및 "$foo"
, ]
, "$foo2"
로 -eq
구성 됩니다 0
.]
마지막으로, consequent-commands
복합 명령의 절은 if
간단한 명령입니다 echo "something"
. 다시 말하면 실행 순서 문제가 발생하지 않습니다.