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

String 如何检查最后一个字符串是否等于'*';在Bash?,string,bash,String,Bash,我需要检查路径是否包含“*”字符作为最后一位数字 我的做法: length=${#filename} ((文件名--) #使用子字符串获取最后一个字符 如果[${img:$length:1}==“*”];然后 回应“是” fi 这将返回[:参数太多错误 我做错了什么?只需使用正则表达式即可 if [[ "$filename" =~ '*'$ ]]; then echo "yes" fi 您的语法中有几个问题 最后一个] 确保在单括号内引用变量 ${variable:${{variab

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

我的做法:

length=${#filename}
((文件名--)
#使用子字符串获取最后一个字符
如果[${img:$length:1}==“*”];然后
回应“是”
fi
这将返回
[:参数太多
错误

我做错了什么?

只需使用正则表达式即可

if [[ "$filename" =~ '*'$ ]]; then 
  echo "yes"
fi
您的语法中有几个问题

  • 最后一个
    ]
  • 确保在单括号内引用变量
  • ${variable:${{variable}:1}
    不会返回任何字符,
    ${variable:$(${variable}-1))}
    应该可以工作(注意,尽管末尾的1长度是多余的)
在您的帖子中,
“*”
]
之间没有空格。这让bash感到困惑。如果语句以
[
开头,bash坚持其最后一个参数为
]
。如果没有空格,最后一个参数是
“*”]
,在删除引号后,它将成为
*]
,而不是
]

总而言之:

length=${#filename}
((length--))
[ "${filename:$length:1}" == "*" ] && echo yes
更多:根据下面的评论,上面的三行可以简化为:

[ "${filename: -1}" == "*" ] && echo yes
-1
是获取最后一个字符的缩写。另一种可能性是:

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

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

您也可以使用模式匹配:
[$filename=*\*]
。您选择哪个是个人偏好的问题。为什么在double[[]]中使用双引号?顺便问一下,为什么在使用double[[]]时使用“if;then fi”sintax?谢谢,这对我很有用!错误是由缺少引号和您解释的方括号错误引起的!+1;还有两件事值得一提:(a)使用
[…]在bash中,
over
[…]
通常是首选(惊喜更少,功能更多)和(b)使用
${filename:-1}
更容易获得最后一个字符(或者,更容易,正如@chepner所建议的,使用
$filename=*\*
)。完全同意mklement0的建议。
[[ $filename = *\* ]] && echo yes