bash中是否有内联if with赋值(三元条件)?

bash中是否有内联if with赋值(三元条件)?,bash,shell,if-statement,operators,Bash,Shell,If Statement,Operators,可能重复: 如果这是AS3或Java,我将执行以下操作: fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 但在shell中,这似乎是不必要的复杂,需要几行代码,以及相当多的重复代码 if [ $useDefault ]; then fileName="$dirName/$defaultName.txt" else fileName="$dirName/$customNam

可能重复:

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

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";
但在shell中,这似乎是不必要的复杂,需要几行代码,以及相当多的重复代码

if [ $useDefault ]; then
    fileName="$dirName/$defaultName.txt"
else
    fileName="$dirName/$customName.txt"
fi
您可以将所有内容压缩为一行,但这将极大地牺牲清晰度


如果在shell中使用变量赋值,有没有更好的方法来编写内联

在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在评论中指出,在
$(…)

中引用了nest,请写:

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

它与您拥有的不完全相同,因为它没有选中
usefault
。相反,它只是检查是否设置了
customName
。当你想使用默认名称时,你不需要设置
usefault
,只需取消设置
customName

威廉·普赛尔的回答没有我的直接,但是如果假设
$usefault
控制是否使用默认名称,这可能是一个更干净的解决方案。我已经更新了我的答案以正确引用所有内容。
fileName=“$dirName/$([$useDefault]&&echo“$defaultName”| | echo“$customName”).txt“
我认为这与
?:
尽可能接近。我非常喜欢
cond
函数,这就是我接受答案的原因,尽管第一个解决方案也保存了重复的代码。您应该将
$(cond…
保留在双引号内(即
文件名=“$dirname/$(cond“$useDefault”“$defaultName”“$customName”).txt“
)--这将防止对字符串cond returns进行一些几乎肯定不必要的额外分析。@GordonDavisson:我考虑过,但它将变量references
$usefault
等放在引号之外。我不确定有没有好的解决办法。@KeithThompson:这不是问题;引号嵌套在
$()
中,因此
$usefault
将被视为双引号。能否提供有关此
运算符的详细信息:-
运算符?(或者至少是一些我可以在谷歌搜索的名字)只要在bash手册页中搜索
:-
。任何
sh
文档都将在
参数扩展
等标题下对此进行描述。有关
bash
,请参阅;对于POSIX shell,请参阅。精彩的介绍,然后进一步介绍:我喜欢这个,它就像Perl中的//运算符(“Undefined or”),我总是使用它来指定默认值。