このようなことをする方法はありますか
int a = (b == 5) ? c : d;
bashを使っている?
三項演算子? :
は、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}
a
が設定されている場合はVAR
の値をVAR
に代入します。それ以外の場合はデフォルト値20
を代入します - これは式の結果でも可能です。
アレックス氏がコメントで指摘しているように、このアプローチは技術的に「パラメータ拡張」と呼ばれています。
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
これにより、||の後の部分が実行されなくなります。誤って&&と||の間のコード失敗します。
これはあなたが一度だけ代入している変数を指定する必要があるもう一つのオプションです、そしてそれはあなたの代入が文字列か数値かどうかは関係ありません:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
ちょっとした考え。 :)
letコマンドは、必要となる基本的な演算子のほとんどをサポートしています。
let a=b==5?c:d;
当然、これは変数の代入に対してのみ機能します。他のコマンドを実行することはできません。
私のユースケースでは次のように動作します。
$ 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"
3項演算子のシェルスクリプトでは、次の3つの方法を使用できます。
[ $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"; }
Bashの三項条件式にも非常によく似た構文があります。
a=$(( b == 5 ? 123 : 321 ))
残念ながら、それは数字でしか機能しません - 私の知る限りでは。
同様の構文が必要な場合はこれを使用できます。
a=$(( $((b==5)) ? c : d ))
ここにいくつかのオプションがあります:
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"`
これは、 ウラジミールの正解 によく似ています。 「三項」が「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