How to check if the last string character equals '*' in Bash?
[ "${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.
- You need a space before the last
]
- Make sure to quote variables inside single brackets
${variable:${#variable}:1}
won't return any characters,${variable:$((${#variable}-1))}
should work (note though the 1 length at the end is redundant)