我需要检查路径是否包含'*'字符作为最后的数字。
我的方法:
length=${#filename}
((filename--))
#use substring to get the last character
if [ ${img:$length:1} == "*"] ;then
echo "yes"
fi
这返回 [: too many arguments
错误。
我在做什么错?
[ "${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
是否与Glod Pattern **
相匹配,其中第一颗恒星表示"任何字符的零或更多",而最后两个字符*
表示是字面的星形字符。因此,上述文件名是否以字面的*
结束。使用[[
解决此问题的另一个解决方案可以在 @broslow的答案中找到。
只需使用regex
if [[ "$filename" =~ '*'$ ]]; then
echo "yes"
fi
您的语法中的几个问题。
- 您需要在上次
]
之前需要一个空间 - 确保在单括号内引用变量
-
${variable:${#variable}:1}
不会返回任何字符,${variable:$((${#variable}-1))}
应该起作用(尽管末尾的1个长度是多余的)