Bash의 조건부 연산자 및 할당

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

왜 콜론 앞에는 할당 연산자만 사용할 수 있나요?

답변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

관련 정보