How do I compare a variable to a string (and do something if they match)?
问题:
回答1:
Using variables in if statements
if [ \"$x\" = \"valid\" ]; then
echo \"x has the value \'valid\'\"
fi
If you want to do something when they don\'t match, replace =
with !=
. You can read more about string operations and arithmetic operations in their respective documentation.
Why do we use quotes around $x
?
You want the quotes around $x
, because if it is empty, your bash script encounters a syntax error as seen below:
if [ = \"valid\" ]; then
Non-standard use of ==
operator
Note that bash
allows ==
to be used for equality with [
, but this is not standard.
Use either the first case wherein the quotes around $x
are optional:
if [[ \"$x\" == \"valid\" ]]; then
or use the second case:
if [ \"$x\" = \"valid\" ]; then
回答2:
Or, if you don\'t need else clause:
[ \"$x\" == \"valid\" ] && echo \"x has the value \'valid\'\"
回答3:
To compare strings with wildcards use
if [[ \"$stringA\" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
回答4:
a=\"abc\"
b=\"def\"
# Equality Comparison
if [ \"$a\" == \"$b\" ]; then
echo \"Strings match\"
else
echo \"Strings don\'t match\"
fi
# Lexicographic (greater than, less than) comparison.
if [ \"$a\" \\< \"$b\" ]; then
echo \"$a is lexicographically smaller then $b\"
elif [ \"$a\" \\> \"$b\" ]; then
echo \"$b is lexicographically smaller than $a\"
else
echo \"Strings are equal\"
fi
Notes:
- Spaces between
if
and[
and]
are important >
and<
are redirection operators so escape it with\\>
and\\<
respectively for strings.
回答5:
I have to disagree one of the comments in one point:
[ \"$x\" == \"valid\" ] && echo \"valid\" || echo \"invalid\"
No, that is not a crazy oneliner
It\'s just it looks like one to, hmm, the uninitiated...
It uses common patterns as a language, in a way;
And after you learned the language.
Actually, it\'s nice to read
It is a simple logical expression, with one special part: lazy evaluation of the logic operators.
[ \"$x\" == \"valid\" ] && echo \"valid\" || echo \"invalid\"
Each part is a logical expression; the first may be true or false, the other two are always true.
(
[ \"$x\" == \"valid\" ]
&&
echo \"valid\"
)
||
echo \"invalid\"
Now, when it is evaluated, the first is checked. If it is false, than the second operand of the logic and &&
after it is not relevant. The first is not true, so it can not be the first and the second be true, anyway.
Now, in this case is the the first side of the logic or ||
false, but it could be true if the other side - the third part - is true.
So the third part will be evaluated - mainly writing the message as a side effect. (It has the result 0
for true, which we do not use here)
The other cases are similar, but simpler - and - I promise! are - can be - easy to read!
(I don\'t have one, but I think being a UNIX veteran with grey beard helps a lot with this.)
回答6:
you can also use use case/esac
case \"$string\" in
\"$pattern\" ) echo \"found\";;
esac
回答7:
following script reads from a file named \"testonthis\" line by line then compares each line with a simple string, a string with special characters and a regular expression if it doesn\'t match then script will print the line o/w not.
space in bash is so much important. so following will work
[ \"$LINE\" != \"table_name\" ]
but following won\'t:
[\"$LINE\" != \"table_name\"]
so please use as is:
cat testonthis | while read LINE
do
if [ \"$LINE\" != \"table_name\" ] && [ \"$LINE\" != \"--------------------------------\" ] && [[ \"$LINE\" =~ [^[:space:]] ]] && [[ \"$LINE\" != SQL* ]]; then
echo $LINE
fi
done
回答8:
I would probably use regexp matches if the input has only a few valid entries. E.g. only the \"start\" and \"stop\" are valid actions.
if [[ \"${ACTION,,}\" =~ ^(start|stop)$ ]]; then
echo \"valid action\"
fi
Note that I lowercase the variable $ACTION
by using the double comma\'s. Also note that this won\'t work on too aged bash versions out there.
回答9:
Bash4+ examples. Note: not using quotes will cause issues when words contain spaces etc.. Always quote in bash IMO.
Here are some examples BASH4+ :
Example 1, check for \'yes\' in string (case insensitive):
if [[ \"${str,,}\" == *\"yes\"* ]] ;then
Example 2, check for \'yes\' in string (case insensitive):
if [[ \"$(echo \"$str\" | tr \'[:upper:]\' \'[:lower:]\')\" == *\"yes\"* ]] ;then
Example 3, check for \'yes\' in string (case sensitive) :
if [[ \"${str}\" == *\"yes\"* ]] ;then
Example 4, check for \'yes\' in string (case sensitive):
if [[ \"${str}\" =~ \"yes\" ]] ;then
Example 5, exact match (case sensitive):
if [[ \"${str}\" == \"yes\" ]] ;then
Example 6, exact match (case insensitive):
if [[ \"${str,,}\" == \"yes\" ]] ;then
Example 7, exact match :
if [ \"$a\" = \"$b\" ] ;then
enjoy.
回答10:
I did it in this way that is compatible with bash, dash (sh):
testOutput=\"my test\"
pattern=\"my\"
case $testOutput in (*\"$pattern\"*)
echo \"if there is a match\"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac