Programing

Bash의 삼항 연산자 (? :)

lottogame 2020. 2. 27. 22:04
반응형

Bash의 삼항 연산자 (? :)


이런 식으로 할 수있는 방법이 있습니까

int a = (b == 5) ? c : d;

배쉬를 사용합니까?


삼항 연산자 ? :if/else

case "$b" in
 5) a=$c ;;
 *) a=$d ;;
esac

또는

 [[ $b = 5 ]] && a="$c" || a="$d"

암호:

a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

조건이 단순히 변수가 설정되어 있는지 확인하는 경우 더 짧은 형식이 있습니다.

a=${VAR:-20}

if 가 설정 되면 a이 할당되고 , 그렇지 않으면 기본값이 할당됩니다 . 이는 표현식의 결과 일 수도 있습니다.VARVAR20

alex가 주석에서 언급 한 것처럼이 방법을 기술적으로 "매개 변수 확장"이라고합니다.


if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi

cond && op1 || op2다른 답변에서 제안 표현은 고유의 버그가 다음과 같은 경우 op1제로가 아닌 종료 상태가, op2자동으로 결과가된다; -e모드 에서도 오류가 발생하지 않습니다 . 그래서, 그 표현은 경우에 사용하는 유일한 안전 op1하지 않을 수 있습니다 (예를 들어 :, true분열과 OS 호출)처럼 (실패 할 수있는 모든 작업없이 내장, 또는 변수 할당하는 경우).

""따옴표를 참고하십시오 . 첫 번째 쌍 $b은 공백이거나 공백이있는 경우 구문 오류를 방지합니다 . 다른 것들은 모든 공백이 단일 공백으로 변환되는 것을 막을 것입니다.


(( a = b==5 ? c : d )) # string + numeric

[ $b == 5 ] && { a=$c; true; } || a=$d

이렇게하면 || 이후 부분을 실행하지 않아도됩니다 &&와 || 사이의 코드가 실수로 우연히 실패합니다.


하자의 명령에서 지원하는 대부분의 사람이 필요 기본 연산자 :

let a=b==5?c:d;

당연히 이것은 변수 할당에만 작동합니다. 다른 명령을 실행할 수 없습니다.


다음은 한 번만 할당 할 변수를 지정해야하는 또 다른 옵션이며 할당이 문자열인지 숫자인지는 중요하지 않습니다.

VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`

그냥 생각이야 :)


다음은 내 사용 사례에서 작동하는 것 같습니다.

$ tern 1 YES NO                                                                             
YES

$ tern 0 YES NO                                                                             
NO

$ tern 52 YES NO                                                                            
YES

$ tern 52 YES NO 52                                                                         
NO

다음과 같이 스크립트에서 사용할 수 있습니다.

RESULT=$(tern 1 YES NO)
echo "The result is $RESULT"

세 개 한 세트

function show_help()
{
  echo ""
  echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}"
  echo ""
  echo "e.g. "
  echo ""
  echo "tern 1 YES NO                            => YES"
  echo "tern 0 YES NO                            => NO"
  echo "tern "" YES NO                           => NO"
  echo "tern "ANY STRING THAT ISNT 1" YES NO     => NO"
  echo "ME=$(tern 0 YES NO)                      => ME contains NO"
  echo ""

  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$3" ]
then
  show_help
fi

# Set a default value for what is "false" -> 0
FALSE_VALUE=${4:-0}

function main
{
  if [ "$1" == "$FALSE_VALUE" ]; then
    echo $3
    exit;
  fi;

  echo $2
}

main "$1" "$2" "$3"

삼항 연산자를 위해 Shell Scripting에서 다음 세 가지 방법을 사용할 수 있습니다.

    [ $numVar == numVal ] && resVar="Yop" || resVar="Nop"

Or

    resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")

Or

    (( numVar == numVal ? (resVar=1) : (resVar=0) ))

(ping -c1 localhost&>/dev/null) && { echo "true"; } || {  echo "false"; }

비슷한 문법을 ​​원한다면 이것을 사용할 수 있습니다

a=$(( $((b==5)) ? c : d ))

bash에는 삼항 조건에 대해 매우 유사한 구문이 있습니다.

a=$(( b == 5 ? 123 : 321  ))

불행히도, 내가 아는 한 숫자로만 작동합니다.


몇 가지 옵션이 있습니다.

1- 그렇다면 한 줄로 사용하면 가능합니다.

if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi

2- 다음과 같은 함수를 작성하십시오.

 # Once upon a time, there was an 'iif' function in MS VB ...

function iif(){
  # Echoes $2 if 1,banana,true,etc and $3 if false,null,0,''
  case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}

이와 같이 스크립트 내부에서 사용하십시오

result=`iif "$expr" 'yes' 'no'`

# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 is not true"` 

3- 대답에서 영감을 얻은,보다 유연하고 한 줄 사용은 다음과 같습니다.

 case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac

 # Expression can be something like:     
   expr=`expr "$var1" '>' "$var2"`

이것은 Vladimir의 훌륭한 답변 과 매우 유사 합니다. "삼항"이 "true, string, false, empty"인 경우 간단하게 수행 할 수 있습니다.

$ c="it was five"
$ b=3
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a

$ b=5
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
it was five

참고 URL : https://stackoverflow.com/questions/3953645/ternary-operator-in-bash



반응형