if를 사용하지 않고 bash에서 직접 조건부 결과를 인쇄합니다.

if를 사용하지 않고 bash에서 직접 조건부 결과를 인쇄합니다.

다음과 같은 간단한 코드가 있다고 가정해 보겠습니다.

echo "Are there any arguments?"
if [ $# -eq 0 ]; then
    echo "false"
else
    echo "true"
fi

보시다시피 조건부 결과를 직접 인쇄할 수 있는 기회가 있으면 좋겠지만 어떻게 해야 할지 모르겠습니다.

다음과 같이 보일 것입니다:

echo "$([ $# -eq 0 ])"

그러나 그것은 진실이 아니다. 없이 이것을 할 수 있나요 if?

답변1

이 경우 목록을 사용할 수 있습니다제어 연산자 &&대신에 ||:

[[ $# -eq 0 ]] && echo false || echo true

[[ $# -eq 0 ]] && { echo false; } \
               || { echo true; }

명령 그룹 { }목록은 단일 명령에만 필요한 것은 아니지만 일반적으로 이러한 구조를 더 읽기 쉽게 만듭니다(목록에도 종결 ;자나 개행 문자가 필요하지만).

@Kusalananda가 지적했듯이 이는 echo명령이 0("true")을 반환하는 간단한 코드(예: 위의 내용이 어휘적으로 유사하지만)에서 작동합니다.확실히C의 단락 평가와 동일한 의미를 갖습니다. 즉:

(argc==1) && printf("false\n") || printf("true\n");  /* C, not bash */

0이 아닌 상태를 반환할 수 있는 명령에 대한 해결 방법은 다음과 같습니다.

[[ $# -eq 0 ]] && { echo false;:; } || { echo true; }

:첫 번째 목록 끝에 있는 추가 " " null 명령은 0(true) 상태를 반환하도록 보장합니다(목록의 반환 상태는 목록에서 실행된 마지막 명령의 종료 상태입니다).

위의 논리는 문제 일치를 목적으로 하는 일반적인 조건부 논리 테스트와 반대이지만 일반적인 논리는 다음과 같습니다.

[[ boolean-condition ]] && { true-actions;:; } || { false-actions; }

또는 이 예를 더 명확하게 하려면 다음을 수행하세요.

[[ $# -eq 0 ]] && { echo no arguments;:; } || { echo found arguments; }

두 개(또는 다른 정의된 수의 상태)가 있는 경우 Stéphane의 답변에 표시된 대로 계산된 인덱스가 있는 배열을 사용할 수도 있습니다.

declare -a bool=([1]=true [0]=false)
echo ${bool[ (($# == 0)) ]}

또는

temperature=70
declare -a porridge=([1]="too hot" [2]="just right" [3]="too cold")
echo ${porridge[ (( temperature >= 75 ? 1 :
                    temperature <= 68 ? 3 : 2 )) ]}

(( ))이는 일반적인 쉘 규칙과 달리 0이 false인 산술 표현식을 사용합니다 .

답변2

다음을 수행할 수 있습니다.

bool=(false true)
echo "${bool[$# != 0]}"

( 또는 ksh 에뮬레이션으로 ksh93가정 ).bashzsh

모든 POSIX 쉘에서,

echo "$(($# != 0))"

1True와 0False가 출력됩니다 .

답변3

이를 사용하여 $?마지막으로 실행된 명령의 종료 코드를 보존할 수 있습니다.

echo "Are there any arguments?"
[ $# -eq 0 ]
echo $?

답변4

아직 댓글을 달 수 없기 때문에(과소 대표됨) 새 답변에서 이를 지적하겠습니다.미스터 스퓨라틱이 솔루션은 다음과 같이 단일 대괄호에서도 작동합니다.

[ $# -eq 0 ] && { echo false; } || { echo true; }

관련 정보