web-dev-qa-db-ja.com

Bashの三項演算子(?:)

このようなことをする方法はありますか

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

bashを使っている?

346
En_t8

三項演算子? :は、if/elseの単なる短縮形です。

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

または

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

コード:

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

条件が単に変数が設定されているかどうかをチェックするだけの場合は、さらに短い形式があります。

a=${VAR:-20}

aが設定されている場合はVARの値をVARに代入します。それ以外の場合はデフォルト値20を代入します - これは式の結果でも可能です。

アレックス氏がコメントで指摘しているように、このアプローチは技術的に「パラメータ拡張」と呼ばれています。

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

他の回答で提案されているcond && op1 || op2式には固有のバグがあります。op1の終了ステータスがゼロ以外の場合、op2は暗黙のうちに結果になります。 -eモードでもエラーは発生しません。そのため、op1が失敗することが決してない場合にのみその式を使用するのが安全です(:、組み込みの場合はtrue、または失敗する可能性のある操作なしの変数代入(除算やOS呼び出しなど).

""の引用符に注意してください。 $bが空白または空白がある場合、最初のペアは構文エラーを防ぎます。他のものはすべての空白の単一のスペースへの翻訳を妨げるでしょう。

57
ivan_pozdeev
(( a = b==5 ? c : d )) # string + numeric
41
dutCh
[ $b == 5 ] && { a=$c; true; } || a=$d

これにより、||の後の部分が実行されなくなります。誤って&&と||の間のコード失敗します。

29
Sir Athos

これはあなたが一度だけ代入している変数を指定する必要があるもう一つのオプションです、そしてそれはあなたの代入が文字列か数値かどうかは関係ありません:

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

ちょっとした考え。 :)

11
Jasonovich

letコマンドは、必要となる基本的な演算子のほとんどをサポートしています。

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

当然、これは変数の代入に対してのみ機能します。他のコマンドを実行することはできません。

10
emu

私のユースケースでは次のように動作します。

$ 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"
7
Brad Parks

3項演算子のシェルスクリプトでは、次の3つの方法を使用できます。

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

Or

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

Or

    (( numVar == numVal ? (resVar=1) : (resVar=0) ))
6
Sujay U N
(ping -c1 localhost&>/dev/null) && { echo "true"; } || {  echo "false"; }
5
wibble

Bashの三項条件式にも非常によく似た構文があります。

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

残念ながら、それは数字でしか機能しません - 私の知る限りでは。

3
Andre Dias

同様の構文が必要な場合はこれを使用できます。

a=$(( $((b==5)) ? c : d ))
3
PRIYESH PATEL

ここにいくつかのオプションがあります:

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"`
2
Sergio Abreu

これは、 ウラジミールの正解 によく似ています。 「三項」が「trueの場合、string、falseの場合、空」の場合、次のようにできます。

$ 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
0
Bruno Bronosky