![|| 또는 && 조건부 작업과 함께 여러 명령을 사용하지 않는 이유는 무엇입니까?](https://linux55.com/image/151182/%7C%7C%20%EB%98%90%EB%8A%94%20%26amp%3B%26amp%3B%20%EC%A1%B0%EA%B1%B4%EB%B6%80%20%EC%9E%91%EC%97%85%EA%B3%BC%20%ED%95%A8%EA%BB%98%20%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이는 쉘(bash, 대시) 프롬프트에서 작동합니다:
[ -z "" ] && echo A || echo B
A
그런데 글을 쓰려고 하는데POSIX쉘 스크립트는 다음과 같이 시작됩니다.
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
왜인지는 모르겠지만 나는메시지가 수신되지 않았습니다:
지정된 인수가 비어 있습니다.
다음과 같이 스크립트를 호출하면:
./test_empty_argument ""
왜 그런 겁니까?
답변1
대사에 주의해주세요
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
이는 다음과 관련이 있습니다.
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."
exit 1
( ;
대부분의 경우 따옴표가 없는 부분은 줄바꿈으로 대체할 수 있습니다.)
즉, exit 1
스크립트에 전달된 매개변수 수에 관계없이 명령문은 항상 실행됩니다. 이는 메시지가 The given argument is empty.
인쇄될 기회가 전혀 없다는 것을 의미합니다.
테스트 후에 여러 문을 실행하기 위해 "단락 구문"을 사용 하려면 { ...; }
.if
if [ "$#" -ne 1 ]; then
echo 'Invalid number of arguments, expected one.' >&2
exit 1
fi
두 번째 테스트에도 동일한 문제가 있습니다.
~에 대한
[ -z "" ] && echo A || echo B
이것은 주어진 예에서 작동하지만 일반적입니다.
some-test && command1 || command2
회의아니요그리고
if some-test; then
command1
else
command2
fi
대신에 더 비슷해요
if ! { some-test && command1; }; then
command2
fi
또는
if some-test && command1; then
:
else
command2
fi
즉, 테스트 또는 첫 번째 명령이 실패하면 두 번째 명령이 실행됩니다. 즉, 실행될 가능성이 있음을 의미합니다.세 개 모두연설이 포함되었습니다.
답변2
이것:
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
아니요:
[ "${#}" -eq 1 ] || { echo "Invalid number of arguments, expected one."; exit 1; }
그러나 그 반대는 다음과 같습니다.
{ [ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; }
exit 1
스크립트에 전달한 인수 수에 관계없이 스크립트는 종료됩니다.
답변3
더 읽기 쉽게 만드는 한 가지 방법은 다음과 같은 die
함수(à la perl
)를 정의하는 것입니다.
die() {
printf >&2 '%s\n' "$@"
exit 1
}
# then:
[ "$#" -eq 1 ] || die "Expected one argument, got $#"
[ -n "$1" ] || die "Empty argument not supported"
필요한 경우 색상, 접두사, 줄 번호 등의 추가 기능을 추가할 수 있습니다.
답변4
나는 종종 이것을 빈 문자열에 대한 테스트라고 생각합니다.
if [ "x$foo" = "x" ]; then ...