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

时间:2014-01-29 07:45:55

标签: string bash

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

我的方法:

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

这会返回“[:太多参数”错误。

我做错了什么?

2 个答案:

答案 0 :(得分:12)

[ "${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是否匹配glob模式*\*,其中第一个星形表示“零或更多任何字符”,最后两个字符\*表示一个文字星形字符。因此,上面测试文件名是否以文字*结尾。使用[[的这个问题的另一个解决方案可以在@ broslow的答案中找到。

答案 1 :(得分:5)

使用正则表达式

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

您的语法中存在一些问题。

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