다음과 같은 간단한 코드가 있다고 가정해 보겠습니다.
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
가정 ).bash
zsh
모든 POSIX 쉘에서,
echo "$(($# != 0))"
1
True와 0
False가 출력됩니다 .
답변3
이를 사용하여 $?
마지막으로 실행된 명령의 종료 코드를 보존할 수 있습니다.
echo "Are there any arguments?"
[ $# -eq 0 ]
echo $?
답변4
아직 댓글을 달 수 없기 때문에(과소 대표됨) 새 답변에서 이를 지적하겠습니다.미스터 스퓨라틱이 솔루션은 다음과 같이 단일 대괄호에서도 작동합니다.
[ $# -eq 0 ] && { echo false; } || { echo true; }