このようなことをする方法はありますか
int a = (b == 5) ? c : d;
Bashを使用していますか?
((...))
。Shell Arithmeticを参照してください。
$(( ))
と算術評価で機能し(( ))
ます。もご覧くださいhttps://mywiki.wooledge.org/ArithmeticExpression
。
このようなことをする方法はありますか
int a = (b == 5) ? c : d;
Bashを使用していますか?
((...))
。Shell Arithmeticを参照してください。
$(( ))
と算術評価で機能し(( ))
ます。もご覧くださいhttps://mywiki.wooledge.org/ArithmeticExpression
。
回答:
三項演算子? :
は、if/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
または
[[ $b = 5 ]] && a="$c" || a="$d"
=
演算子は、数値の等価性ではなく文字列の等価性をテストすることに注意してください(つまり[[ 05 = 5 ]]
、false)。数値比較が必要な場合は、-eq
代わりに使用してください。
if/then/else
cond && op1 || op2
構築物は、固有のバグがあります場合はop1
、何らかの理由でゼロ以外の終了ステータスがあり、その結果は黙っになりますop2
。if cond; then op1; else op2; fi
1行でもあり、その欠陥はありません。
コード:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
がエイリアス化された複数行のコマンド(などecho 1; echo 2
)である場合は、括弧で囲む必要があることに注意してください。
&&
がゼロ以外の終了ステータスにならないことが確実である場合にのみ、3項演算子のように動作します。それ以外の場合は、a && b || c
「予想外に」実行するc
場合はa
成功したがb
失敗しました。
条件が変数が設定されているかどうかを確認するだけの場合は、さらに短い形式があります。
a=${VAR:-20}
if が設定されている場合はa
値が割り当てられ、それ以外のVAR
場合VAR
はデフォルト値が割り当てられます。20
これは式の結果である場合もあります。
コメントでアレックスが指摘するように、このアプローチは技術的に「パラメータ拡張」と呼ばれています。
a=${1:-'my-hyphenated-text'}
:-
)
${VAR:-yes:-no}
。
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
cond && op1 || op2
他の回答で提案されている表現は、固有のバグがあります場合はop1
ゼロ以外の終了ステータスを持って、op2
静かに結果となり、エラーは-e
モードでもキャッチされません。だから、その式は、以下の場合に使用するだけで安全でop1
失敗することはできません(例えば、:
、true
分裂とOSコール)のように(失敗する可能性があります任意の操作をせずに組み込み、または変数割り当てている場合)。
""
引用符に注意してください。最初のペア$b
は、空白または空白がある場合に構文エラーを防ぎます。他のものは、すべての空白が単一のスペースに変換されるのを防ぎます。
[ "x$b" -eq "x" ]
ますが、特に空の文字列をテストするために使用されたと思います。zshが使用する構文(zshexpnマンページの「PARAMETER EXPANSION」)を使用したいのですが、それらの移植性についてはよくわかりません。
(( a = b==5 ? c : d )) # string + numeric
(( ))
扱いとして任意の/すべての文字列0
a=$(( b==5 ? c : d ))
[ $b == 5 ] && { a=$c; true; } || a=$d
これにより、||の後の部分の実行が回避されます。&&と||の間のコードが誤って 失敗します。
-e
モードでエラーをキャッチしません:(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
する代わりに、ブリットインを使用します。true
exec
&&
.. を使用||
して、それらの間で失敗したコマンドをキャッチする方法はありますか?
&&
および||
定義により、それらの前のコマンド全体に適用されます。したがって、その前に2つのコマンドがある場合(それらがどのように組み合わされているかに関係なく)、それを一方にのみ適用して、もう一方に適用することはできません。フラグ変数を使って/ / ロジックをエミュレートできますが、/ / 適切なものがあるのになぜ迷惑をかけるのですか?if
then
else
if
then
else
これは、割り当てる変数を1回指定するだけでよく、割り当てが文字列であるか数値であるかは関係ありません。
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
ちょっとした考え。:)
[ test ]
ます。そのため、コマンドがstdoutに何も出力しないことを「知っている」場合にのみ、構造は安全に使用できます。
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"
tern
バッシュの一部?Macにはないようです
chmod 700 tern
、同じフォルダーで実行します。これtern
で、ターミナルにコマンドが表示されます
三項演算子のシェルスクリプトでは、次の3つの方法を使用できます。
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
同様の構文が必要な場合は、これを使用できます
a=$(( $((b==5)) ? c : d ))
a=$(((b==5) ? : c : d))
- $((...))
計算の結果を別の変数に割り当てたいときだけ必要です。
ここにいくつかのオプションがあります:
1-それ以外の場合は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-ケースの回答にインスパイアされた、より柔軟で1行の使用法は次のとおりです。
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac
# Expression can be something like:
expr=`expr "$var1" '>' "$var2"`
これはウラジミールのすばらしい答えによく似ています。「3項」が「trueの場合、文字列、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
bash
、「3項演算子」に似たものがあることを示していますが、bash
これは「条件演算子」と呼ばれていますexpr?expr:expr
(man bash
「算術評価」セクションを参照してください)。覚えておいてbash
「条件演算子」はトリッキーであり、いくつかの落とし穴があります。