如何将变量与字符串进行比较(如果匹配则执行某些操作)?
要将字符串与通配符进行比较,请使用
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
如果您想在它们不匹配时执行某些操作,请将=
替换=
!=
。 您可以在各自的文档中阅读有关字符串运算和算术运算的更多信息。
$x
周围使用引号? 您需要在$x
周围加上引号,因为如果它为空,则bash脚本会遇到语法错误,如下所示:
if [ = "valid" ]; then
==
运算符的非标准用法 请注意, bash
允许==
用于与[
相等[
,但这不是标准的 。
使用第一种情况,其中$x
左右的引号是可选的:
if [[ "$x" == "valid" ]]; then
或使用第二种情况:
if [ "$x" = "valid" ]; then
或者,如果您不需要else子句:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
您还可以使用用例/ esac
case "$string" in
"$pattern" ) echo "found";;
esac
如果输入只有几个有效条目,我可能会使用regexp匹配项。 例如,只有“开始”和“停止”是有效的动作。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
请注意,我使用双逗号将变量$ACTION
小写。 还要注意,这对于太老的bash版本不起作用。
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
笔记:
if
和[
和]
之间的空格很重要 >
和<
是重定向操作符,因此对于字符串,分别使用\\>
和\\<
对其进行转义。 我必须不同意其中一项评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
只是看起来好像是一个未开始的人...
它以某种方式使用通用模式作为语言。
在您学习了语言之后。
这是一个简单的逻辑表达式,有一个特殊部分:逻辑运算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式; 第一个可能为true或false,其他两个始终为true。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,在评估时,将检查第一个。 如果为假,则与逻辑的第二个操作数和 &&
无关。 第一个是不正确的,因此无论如何它不能是第一个和第二个都是正确的。
现在,在这种情况下是逻辑或 ||
的第一面。 错误,但如果另一面(第三部分)是正确的,则可能是正确的。
因此,将对第三部分进行评估-主要是将消息写为副作用。 (它的结果为0
为true,在此不使用)
其他情况相似,但更简单-而且-我保证! 是-可以-易于阅读!
(我没有,但是我认为拥有灰胡子的UNIX老手对此很有帮助。)
以下脚本逐行从名为“ testonthis”的文件中读取内容,然后将每行与一个简单字符串,一个包含特殊字符的字符串和一个正则表达式(如果不匹配)进行比较,则脚本将不打印o / w行。
bash中的空间非常重要。 所以下面的工作
[ "$LINE" != "table_name" ]
但是以下内容不会:
["$LINE" != "table_name"]
所以请按原样使用:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
我这样做是与bash,破折号(sh)兼容的:
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
Bash4 +示例。 注意:如果单词包含空格等,不使用引号会引起问题。始终在bash IMO中使用引号。
这是BASH4 +的一些示例:
示例1,检查字符串中的“是”(不区分大小写):
if [[ "${str,,}" == *"yes"* ]] ;then
示例2,检查字符串中的“是”(不区分大小写):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
示例3,检查字符串中的“是”(区分大小写):
if [[ "${str}" == *"yes"* ]] ;then
示例4,检查字符串中的“是”(区分大小写):
if [[ "${str}" =~ "yes" ]] ;then
示例5,完全匹配(区分大小写):
if [[ "${str}" == "yes" ]] ;then
示例6,完全匹配(不区分大小写):
if [[ "${str,,}" == "yes" ]] ;then
示例7,完全匹配:
if [ "$a" = "$b" ] ;then
请享用。
if [ $VAR= "TEST" ]; then
echo "variable VAR matches with string TEST"
else
echo "VAR does not match with the string TEST"
fi