콜론 뒤에 할당 연산자와 함께 bash의 조건부 연산자를 사용할 수 있습니까?
Bash 참조 매뉴얼 은 산술 연산자를 다음과 같이 설명합니다.
- 조건부 연산자
expr ? expr : expr
- 할당
= *= /= %= += -= <<= >>= &= ^= |=
먼저이 코드는 잘 작동하는 것 같습니다.
a=1; ((a? b=1 : 2 )) #seems to work
하지만 :
이후 할당 연산자를 사용하면 “비 변수 할당 시도”오류가 발생합니다.
a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error
콜론 앞에 할당 연산자 만 사용할 수있는 이유는 무엇입니까?
설명
Answer
Bash는 마지막 명령을
a=1; (( (a? b=1 : c)=1 ))
로 파싱하여 작동하지 않는 이유를 명확히합니다. 대신
a=1; (( a? b=1 : (c=1) ))
Answer
ternary assignment
표현식. 다음은 제 다른 답변입니다.
% a=abc % b=abcd % t=10 ; f=5 % echo $((r=${#a}>${#b}?t:f)) ; echo $r > 5 > 5 % echo $((r=${#a}<${#b}?t:f)) ; echo $r > 10 > 10
이것이 조건부 할당 작업입니다. 조건에 따라 다릅니다. 구문은 다음과 같이 작동합니다.
$((var = $condition <compare_operator> $condition \ ?if $true_assign :or $false_assign ))
이것을 올바르게 사용하고 있다고 생각하지 않습니다.
From wikipedia :
?:
사용 다음과 같습니다 :
condition ? value_if_true : value_if_false
조건은 부울 표현식으로 참 또는 거짓으로 평가됩니다. 부울 조건의 평가를 기반으로 전체 표현식은 조건이 참이면 value_if_true를 반환하고 그렇지 않으면 value_if_false를 반환합니다. 일반적으로 두 개의 하위 표현식 value_if_true 및 value_if_false는 전체 표현식의 유형을 결정하는 동일한 유형을 가져야합니다. 이 유형 검사의 중요성은 조건부 할당 문에서 연산자의 가장 일반적인 사용에 있습니다.이 사용법에서는 다음과 같이 할당 문 오른쪽에 표현식으로 나타납니다.
variable = condition ? value_if_true : value_if_false
?:
연산자는 조건식 (if-then-else
구문)이 Scheme, ML, Haskell과 같은 함수형 프로그래밍 언어에서 작동하는 방식과 유사합니다. if-then-else는 해당 언어로 된 진술 대신에 표현할 수 있습니다.
당신의 특정 문제가 이것과 관련이 있다고 생각합니다 :
if-else 구문에서와 같이 “x”및 “y”표현식 중 하나만 평가됩니다.
ternary
표현식에 대한 위 링크를 읽은 경우 당신은 그 평가를 볼 수 있습니다 n은 단락되었으므로 false 측에 대한 할당 오류는 1 = true
이기 때문입니다.
어쨌든 상관 없습니다. 이것이 당신이 생각하는대로 작동하지 않는다고 생각하기 때문입니다.
답변
삼항 연산자는 시험. 분기에는 사용되지 않습니다.
bash에 대한 의사 삼항 연산자를 얻는 한 가지 방법은 다음과 같습니다 (백틱 참고).
$result=`[ < condition > ] && echo "true-result" || echo "false-result" `
$ a=
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
0
$ a=5
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
1
dash, zsh, sh
에서ternary
연산자를 테스트했습니다. div> 및bash
및 POSIX에 의해 지정되지 않았음에도 불구하고 모두 동일하게 작동합니다. 귀하의 예제는 내가 아는 한bash
및zsh
에서만 작동합니다. 그러나 이것은 POSIX 친화적입니다 :( : ${a?} ) && b=1 || c=1
. 또한ternary
또는 자신의 예제보다 훨씬 읽기 쉽습니다.