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”),我总是使用它来指定默认值。