如何在 Bash 中检查最后一个字符串字符是否等于 '*'?



我需要检查路径是否包含'*'字符作为最后的数字。

我的方法:

length=${#filename}
((filename--))
#use substring to get the last character
if [ ${img:$length:1} == "*"] ;then
   echo "yes"
fi

这返回 [: too many arguments 错误。

我在做什么错?

[ "${filename:$length:1}" == "*" ] && echo yes

在您的帖子中,"*"]之间没有空间。这使Bash感到困惑。如果语句以[开头,则Bash坚持其最后一个参数是]。没有空间,最后一个参数是 "*"],引用删除后,它变成 *],它不是 ]

将它们放在一起:

length=${#filename}
((length--))
[ "${filename:$length:1}" == "*" ] && echo yes

更多:根据下面的注释,上面的三行可以简化为:

[ "${filename: -1}" == "*" ] && echo yes

-1是获得最后一个字符的速记。另一个可能性是:

[[ $filename = ** ]] && echo yes

这使用Bash更强大的条件测试[[。以上看到$filename是否与Glod Pattern **相匹配,其中第一颗恒星表示"任何字符的零或更多",而最后两个字符*表示是字面的星形字符。因此,上述文件名是否以字面的*结束。使用[[解决此问题的另一个解决方案可以在 @broslow的答案中找到。

只需使用regex

if [[ "$filename" =~ '*'$ ]]; then 
  echo "yes"
fi

您的语法中的几个问题。

  • 您需要在上次]
  • 之前需要一个空间
  • 确保在单括号内引用变量
  • ${variable:${#variable}:1}不会返回任何字符, ${variable:$((${#variable}-1))}应该起作用(尽管末尾的1个长度是多余的)

相关内容

  • 没有找到相关文章

最新更新