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

IQA*_*eas 8 bash shell if-statement operators

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

如果这是AS3或Java,我会做以下事情:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";
Run Code Online (Sandbox Code Playgroud)

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

if [ $useDefault ]; then
    fileName="$dirName/$defaultName.txt"
else
    fileName="$dirName/$customName.txt"
fi
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*ell 16

写吧:

fileName=${customName:-$defaultName}.txt
Run Code Online (Sandbox Code Playgroud)

它与你所拥有的并不完全相同,因为它没有检查useDefault.相反,它只是检查是否customName已设置.useDefault您可以直接取消设置,而不是设置何时使用默认值customName.

  • 对于`bash`,请参阅[参数扩展](http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion); 对于POSIX shell,请参阅[参数扩展](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02). (4认同)

Kei*_*son 9

?:shell中没有条件运算符,但是你可以使代码更加冗余,如下所示:

if [ $useDefault ]; then
    tmpname="$defaultName"
else
    tmpname="$customName"
fi
fileName="$dirName/$tmpname.txt"
Run Code Online (Sandbox Code Playgroud)

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

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

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt"
Run Code Online (Sandbox Code Playgroud)

虽然这可能是矫枉过正(并且它会评估所有三个参数).

感谢Gordon Davisson在评论中指出引用内嵌$(...).