I need to check if a path contains the '*' character as last digit.
My approach:
length=${#filename}
((filename--))
#use substring to get the last character
if [ ${img:$length:1} == "*"] ;then
echo "yes"
fi
This returns the [: too many arguments error.
What am I doing wrong?
[ "${filename:$length:1}" == "*" ] && echo yes
In your post, there was no space between "*" and ]. This confuses bash. If a statement begins with [, bash insists that its last argument be ]. Without the space, the last argument is "*"] which, after quote removal, becomes *] which is not ].
Putting it all together:
length=${#filename}
((length--))
[ "${filename:$length:1}" == "*" ] && echo yes
MORE: As per the comments below, the three lines above can be simplified to:
[ "${filename: -1}" == "*" ] && echo yes
The -1 is shorthand for getting the last character. Another possibility is:
[[ $filename = *\* ]] && echo yes
This uses bash's more powerful conditional test [[. The above sees if $filename is matches the glob pattern *\* where the first star means "zero or more of any character" and the last two characters, \*, mean a literal star character. Thus, the above tests for whether filename ends with a literal *. Another solution to this problem using [[ can be found in @broslow's answer.
Just use regex
if [[ "$filename" =~ '*'$ ]]; then
echo "yes"
fi
Couple of issues in your syntax.
] ${variable:${#variable}:1} won't return any characters, ${variable:$((${#variable}-1))} should work (note though the 1 length at the end is redundant)If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With