在bash中是否有内联(如果有)赋值(三元条件)?

时间:2012-12-31 23:05:15

标签: bash shell if-statement operators

  

可能重复:
  Ternary operator (?:) in Bash

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

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

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

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

你可以将这一切压缩成一行,但这极大地牺牲了清晰度。

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

2 个答案:

答案 0 :(得分:16)

只需写下:

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

它与你所拥有的不完全相同,因为它不会检查useDefault。相反,它只是检查是否设置了customName。您想要使用默认值时,不必设置useDefault,而只需取消设置customName

答案 1 :(得分:9)

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在评论中指出引用嵌套在$(...)内。