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

Jon*_*aSc 10 string bash

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

我的方法:

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

这会返回"[:太多参数"错误.

我究竟做错了什么?

Joh*_*024 14

[ "${filename:$length:1}" == "*" ] && echo yes
Run Code Online (Sandbox Code Playgroud)

在你的帖子中,"*"和之间没有空格].这让bash感到困惑.如果一个语句开头[,bash坚持认为它的最后一个参数是].没有空格,最后一个参数是"*"]在引用删除之后变为*]哪个不是].

把它们放在一起:

length=${#filename}
((length--))
[ "${filename:$length:1}" == "*" ] && echo yes
Run Code Online (Sandbox Code Playgroud)

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

[ "${filename: -1}" == "*" ] && echo yes
Run Code Online (Sandbox Code Playgroud)

-1是获取最后一个角色的简写.另一种可能性是:

[[ $filename = *\* ]] && echo yes
Run Code Online (Sandbox Code Playgroud)

这使用了bash更强大的条件测试[[.上面看到if $filename匹配的*\*是第一个星形意味着"零个或多个任何字符"和最后两个字符的glob模式\*,表示一个文字星形字符.因此,上面测试文件名是否以文字结尾*.使用此问题的另一种解决方案[[可以在@ broslow的答案中找到.


Rei*_*ase 7

只需使用正则表达式

if [[ "$filename" =~ '*'$ ]]; then 
  echo "yes"
fi
Run Code Online (Sandbox Code Playgroud)

您的语法中的几个问题.

  • 在最后一个之前需要一个空格 ]
  • 确保在单括号内引用变量
  • ${variable:${#variable}:1}不会返回任何字符,${variable:$((${#variable}-1))}应该工作(注意尽管最后的1长度是多余的)

  • 您还可以使用模式匹配:`[[ $filename = *\* ]]`。您选择哪个是个人喜好的问题。 (2认同)