我需要检查路径是否包含'*'字符作为最后一位数。
我的方法:
length=${#filename}
((filename--))
#use substring to get the last character
if [ ${img:$length:1} == "*"] ;then
echo "yes"
fi
这会返回“[:太多参数”错误。
我做错了什么?
答案 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长度是多余的)