8

可能重复:
Bash 中的三元运算符 (?:)

如果这是 AS3 或 Java,我会执行以下操作:

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

但在 shell 中,这似乎是不必要的复杂,需要几行代码,以及相当多的重复代码。

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

您可以将所有内容压缩成一行,但这会极大地牺牲清晰度。

有没有更好的方法if在 shell 中编写带有变量赋值的内联?

4

2 回答 2

17

写吧:

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

它与您所拥有的并不完全相同,因为它不检查useDefault. 相反,它只是检查是否customName已设置。无需设置useDefault何时要使用默认值,只需取消设置customName

于 2013-01-01T00:06:06.980 回答
10

shell中没有?:条件运算符,但您可以像这样使代码少一些冗余:

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

或者您可以编写自己的 shell 函数,其作用类似于?:运算符:

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

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

虽然这可能有点矫枉过正(它会评估所有三个参数)。

感谢 Gordon Davisson 在评论中指出嵌套在$(...).

于 2012-12-31T23:11:15.943 回答