如果不存在,则添加后缀(bash)

如果不存在,则添加后缀(bash),bash,variables,Bash,Variables,如果字符串不存在的话,我正试图找到向字符串(在bash中)添加后缀的最佳方法 我首先想到的是: case "$R" in *.git ) ;; * ) R=$R.git ;; esac 这很有效。但这很麻烦 然后想一想: R=${R%.git}.git 这是好的,紧凑,整洁 还有其他选择吗?有什么我应该知道的吗 [[ $r == *.git ]] || r+=.git 这将是我首选的方法 shopt -s extglob case $r in !(*.git)) r+=.g

如果字符串不存在的话,我正试图找到向字符串(在bash中)添加后缀的最佳方法

我首先想到的是:

case "$R" in
    *.git ) ;;
    * ) R=$R.git ;;
esac
这很有效。但这很麻烦

然后想一想:

R=${R%.git}.git
这是好的,紧凑,整洁

还有其他选择吗?有什么我应该知道的吗

[[ $r == *.git ]] || r+=.git
这将是我首选的方法

shopt -s extglob
case $r in !(*.git)) r+=.git; esac
可能是更好的
案例
方法。如果确保
R
已设置且不为空,则第二个方法可能足够好。其他可能性包括:

${r:+'declare'} r="${r%.git}.git"
r=${r%.git}.git ${r:+'true'}

对于POSIX SH,您的任一方法都很好,不过您应该考虑不使用所有的CAPS变量名。

他的原始生成“.git”;您的解决方案没有为我设置
r
。@chepner这就是重点<代码>r=foo.gi${r:+声明r=${r%.git}.git};echo“$r”生成
foo.gi.git
。但是,如果r为unset或null,则扩展将变为nothing,并且不会执行declare命令。这将防止在未设置为开始时设置r。如果您希望
r
变成
.git
,只有当
r
为空但未取消设置时,才从扩展中删除冒号。+1谢谢-我没有想到r没有被设置。我的脚本确实以其他方式检查参数,但这是需要注意的。