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 

콜론 앞에 할당 연산자 만 사용할 수있는 이유는 무엇입니까?

설명

  • 조건부 연산자를 사용하여 변수 할당을 수행하는 것은 재미있을 수 있지만 ' 코드를 읽기 어렵게 만듭니다. '
  • @devnull 코드라고 생각합니다 '의 가독성은 읽는 사람에 따라 다릅니다. 그래도 귀하의 말이 사실 일 수 있지만 ' dash, zsh, sh에서 ternary 연산자를 테스트했습니다. div> 및 bash 및 POSIX에 의해 지정되지 않았음에도 불구하고 모두 동일하게 작동합니다. 귀하의 예제는 내가 아는 한 bashzsh에서만 작동합니다. 그러나 이것은 POSIX 친화적입니다 : ( : ${a?} ) && b=1 || c=1. 또한 ternary 또는 자신의 예제보다 훨씬 읽기 쉽습니다.
  • 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

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다