콜론 뒤에 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
왜 콜론 앞에는 할당 연산자만 사용할 수 있나요?
답변1
Bash는 마지막 명령을 다음과 같이 구문 분석합니다.
a=1; (( (a? b=1 : c)=1 ))
이렇게 하면 왜 작동하지 않는지 명확해집니다. 대신에 다음을 사용해야 합니다.
a=1; (( a? b=1 : (c=1) ))
답변2
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 ))
나는 당신이 이것을 올바르게 사용하고 있다고 믿지 않습니다.
~에서위키피디아:
?:
다음과 같이 사용하세요:
condition ? value_if_true : value_if_false
조건은 부울 표현식으로 true 또는 false로 평가됩니다. 부울 조건의 평가에 따라 전체 표현식은 조건이 true이면 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
평가가 단락되어 있음을 알 수 있으므로잘못된가장자리 오류는 1 = true
.
어쨌든, 나는 그것이 당신이 생각하는 것과 다르다고 생각하기 때문에 중요하지 않습니다.
답변3
삼항 연산자는 테스트를 기반으로 값을 반환합니다. 지점에는 사용되지 않습니다.
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