How to check if the last string character equals '*' in Bash?

bash, string

Solution

[ "${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.

Problem

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?

Original source