如果这是AS3或Java,我会执行以下操作:
fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";
但是在shell中,这似乎不必要地复杂,需要几行代码,以及相当多的重复代码。
if [ $useDefault ]; then
fileName="$dirName/$defaultName.txt"
else
fileName="$dirName/$customName.txt"
fi
你可以将这一切压缩成一行,但这极大地牺牲了清晰度。
有没有更好的方法在shell中编写带有变量赋值的内联if
?
答案 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在评论中指出引用嵌套在$(...)
内。