String 如何在Bash中比较字符串
如何将变量与字符串进行比较(如果匹配,则执行操作)?在if语句中使用变量 如果您想在它们不匹配时执行某些操作,请将String 如何在Bash中比较字符串,string,bash,String,Bash,如何将变量与字符串进行比较(如果匹配,则执行操作)?在if语句中使用变量 如果您想在它们不匹配时执行某些操作,请将=替换为=。您可以在各自的文档中阅读更多关于和的信息 为什么我们在$x周围使用引号? 您希望在$x周围加引号,因为如果它为空,则Bash脚本会遇到语法错误,如下所示: if [ = "valid" ]; then 非标准使用==运算符 请注意,Bash允许使用==与[相等,但是 使用第一种情况,其中,$x周围的引号是可选的: if [[ "$x" == "valid" ]]; t
=
替换为=代码>。您可以在各自的文档中阅读更多关于和的信息
为什么我们在$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:
要将字符串与通配符进行比较,请使用:
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do something here
fi
如果输入只有几个有效条目,我可能会使用regexp匹配。例如,只有“开始”和“停止”是有效的操作
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
请注意,我使用双逗号将变量$ACTION
小写。还要注意的是,这对太旧的bash版本不起作用。a=“abc”
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
b=“def”
#平等比较
如果[“$a”==“$b”];则
回显“字符串匹配”
其他的
回显“字符串不匹配”
fi
#字典(大于,小于)比较。
如果[“$a”\<“$b”];则
echo“$a在词典编纂上比$b小”
elif[“$a”\>“$b”];然后
echo“$b在词典编纂上小于$a”
其他的
回声“字符串相等”
fi
注意事项:
if
和[
和]
之间的空格很重要
和
都是重定向操作符,因此请使用code\>
和\对其进行转义,我不得不在一点上不同意其中一条评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
不,那不是一条疯狂的单行线
它只是看起来像一个,嗯,外行
在某种程度上,它使用通用模式作为一种语言
在你学会语言之后
事实上,读起来很好
它是一个简单的逻辑表达式,有一个特殊部分:逻辑运算符的惰性求值
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式;第一部分可能为真或假,其他两部分始终为真
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,当对其求值时,将检查第一个操作数。如果它为false,则逻辑的第二个操作数和它不相关后的第二个操作数。
现在,在本例中,逻辑的第一方是或|
false,但如果另一方(第三方)为true,则可能为true
因此,将对第三部分进行评估-主要是将消息作为副作用写入。(它的结果0
为true,我们在这里不使用该结果)
其他情况类似,但更简单——我保证!是——可以——很容易阅读!
(我没有,但我认为作为一个有着灰胡子的UNIX老手会有很大帮助。)下面的脚本读取一个名为“testonthis”的文件逐行比较,然后将每行与简单字符串、带有特殊字符的字符串和正则表达式进行比较。如果不匹配,则脚本将打印该行,否则不会打印
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)兼容:
Bash4+示例。注意:当单词包含空格等时,不使用引号会导致问题。请始终在Bash、IMO中引用
下面是Bash 4+中的一些示例:
示例1,检查字符串中的“是”(不区分大小写):
示例2,检查字符串中的“是”(不区分大小写):
示例3,检查字符串中的“是”(区分大小写):
示例4,检查字符串中的“是”(区分大小写):
示例5,精确匹配(区分大小写):
示例6,精确匹配(不区分大小写):
例7,精确匹配:
if [ "$a" = "$b" ] ;then
享受。你有比较问题吗?(如下图所示?
尝试使用=~操作符(正则表达式操作符),它可能会工作:
var="true"
if [[ $var =~ "true" ]];then
#now it works here!!
else
#no more inequality
fi
另请参见:另请参见:如果您确实需要一个else子句,并且想要制作一个疯狂的一行代码:[“$x”==“valid”]&&echo“valid”| | echo“invalid”@mattweight:这通常是个坏主意,因为echo
可能会失败。即使可能出现的问题,从marko&&MattWhite@gniourf_gniourf,没有问题,请使用[“$X”==“valid”]| |(echo invalid&&false)&&echo“valid”
@124312344123411234123{echo invalid&&false;}
比(echo invalid&&false)
更有效,因为它避免了支付不必要的子shell。这与中给出的接受答案有什么关系?我在使用[“$1”时遇到了相同的错误“==”在“]
上。将此更改为[“$1”=”在“]解决了这个问题。空格是必需的。@JohnFeminella在编写bash脚本时,应该有一个=
,而不是两个。@user13107那么您可能使用的是sh
,而不是bash
。这是一个关于bash
的问题。可能值得注意的是,您不能使用[$x-eq“valid”]
-eq
是整数而不是字符串的比较运算符。通配符只能在右侧使用,这一点很重要!还要注意通配符周围缺少的“
。(顺便说一句,通配符+1!)必须引用扩展名$stringB
(顺便说一句,不需要引用左侧):如果[[$stringA=*“$stringB”*]];则
。我尝试在文件路径中使用相同的通配符逻辑作为文件名。但它对我不起作用。尝试了此处提供的所有不同通配符字符串。但总是转到其他情况。在我的情况下,stringA是文件路径/tmp/文件,stringB是“文件”。感谢您的帮助
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
if [[ "${str,,}" == *"yes"* ]] ;then
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
if [[ "${str}" == *"yes"* ]] ;then
if [[ "${str}" =~ "yes" ]] ;then
if [[ "${str}" == "yes" ]] ;then
if [[ "${str,,}" == "yes" ]] ;then
if [ "$a" = "$b" ] ;then
var="true"
if [[ $var == "true" ]];then
#should be working but it is not....
else
#it is falling here...
fi
var="true"
if [[ $var =~ "true" ]];then
#now it works here!!
else
#no more inequality
fi