8

重複の可能性:
Bashの三項演算子(?:)

これがAS3またはJavaの場合、次のようにします。

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";

しかし、シェルでは、それは不必要に複雑に見え、数行のコードと、かなりの繰り返しコードが必要になります。

if [ $useDefault ]; then
    fileName="$dirName/$defaultName.txt"
else
    fileName="$dirName/$customName.txt"
fi

それをすべて1行に圧縮することもできますが、それは明快さを大幅に犠牲にします。

ifシェルで変数代入を使用してインラインを記述するより良い方法はありますか?

4

2 に答える 2

17

書くだけ:

fileName=${customName:-$defaultName}.txt

をチェックしないので、あなたが持っているものとはまったく同じではありませんuseDefault。代わりに、customNameが設定されているかどうかを確認するだけです。useDefaultデフォルトを使用するときに設定する代わりに、設定を解除するだけcustomNameです。

于 2013-01-01T00:06:06.980 に答える
10

シェルには条件演算子はありません?:が、次のようにコードの冗長性を少し減らすことができます。

if [ $useDefault ]; then
    tmpname="$defaultName"
else
    tmpname="$customName"
fi
fileName="$dirName/$tmpname.txt"

?:または、演算子のように機能する独自のシェル関数を作成することもできます。

cond() {
    if [ "$1" ] ; then
        echo "$2"
    else
        echo "$3"
    fi
}

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt"

ただし、これはおそらくやり過ぎです (そして、3 つの引数すべてを評価します)。

引用符で囲まれた入れ子をコメントで指摘してくれた Gordon Davisson に感謝します$(...)

于 2012-12-31T23:11:15.943 に答える