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}
应该可以工作(注意,尽管末尾的1长度是多余的)${variable:$(${variable}-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