如何在Bash中比较字符串

如何将变量与字符串进行比较(如果它们匹配,则执行某些操作)?

1446133 次浏览

在if语句中使用变量

if [ "$x" = "valid" ]; thenecho "x has the value 'valid'"fi

如果你想在它们不匹配时做某事,请将=替换为!=。您可以在各自的留档中阅读有关字符串操作算术运算的更多信息。

为什么我们在$x周围使用引号?

您需要$x左右的引号,因为如果它为空,您的Bash脚本会遇到语法错误,如下所示:

if [ = "valid" ]; then

==运算符的非标准使用

请注意,Bash允许==用于与[相等,但这不是标准

使用第一种情况,其中$x周围的引号是可选的:

if [[ "$x" == "valid" ]]; then

或者使用第二种情况:

if [ "$x" = "valid" ]; then

或者,如果您不需要否则子句:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

您也可以使用use案件/esac

case "$string" in"$pattern" ) echo "found";;esac

要将字符串与通配符进行比较,请使用:

if [[ "$stringA" == *"$stringB"* ]]; then# Do something hereelse# Do something herefi

如果输入只有几个有效条目,我可能会使用正则表达式匹配。例如。只有“开始”和“停止”是有效的操作。

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; thenecho "valid action"fi

请注意,我通过使用双逗号来小写变量$ACTION。还要注意,这在太陈旧的bash版本上不起作用。

a="abc"b="def"
# Equality Comparisonif [ "$a" == "$b" ]; thenecho "Strings match"elseecho "Strings don't match"fi
# Lexicographic (greater than, less than) comparison.if [ "$a" \< "$b" ]; thenecho "$a is lexicographically smaller then $b"elif [ "$a" \> "$b" ]; thenecho "$b is lexicographically smaller than $a"elseecho "Strings are equal"fi

备注:

  1. if[]之间的空格很重要
  2. ><是重定向运算符,因此对于字符串,分别使用\>\<进行转义。

我不得不同意其中一个评论:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

不,这不是一个疯狂的单线

只是它看起来像一个,嗯,外行…

它使用共同的模式作为一种语言,在某种程度上;

在你学会了语言之后。

事实上,读起来很不错

它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

每个部分都是一个逻辑表达式;第一个可能是真或假,另外两个总是真。

([ "$x" == "valid" ]&&echo "valid")||echo "invalid"

现在,当它被评估时,检查第一个。如果它为假,比它之后的逻辑<强>和&&的第二个操作数无关。第一个不是真的,所以无论如何,它不可能是第一个,第二个是真的。
现在,在这种情况下,逻辑<强>或||的第一面为false,但如果另一面-第三部分-为true,则可能为true。

所以第三部分将被评估-主要是将消息作为副作用写入。(它的结果0为true,我们在这里不使用)

其他情况类似,但更简单-和-我保证!是-可以-容易阅读!
(我没有,但我认为作为一个灰胡子的UNIX老手对此有很大帮助。

以下脚本逐行读取名为“testonthis”的文件,然后将每行与一个简单字符串、一个带有特殊字符的字符串和一个正则表达式进行比较。如果不匹配,则脚本将打印该行,否则不匹配。

Bash中的空间非常重要。因此,以下操作将有效:

[ "$LINE" != "table_name" ]

但以下内容不会:

["$LINE" != "table_name"]

请按原样使用:

cat testonthis | while read LINEdoif [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; thenecho $LINEfidone

我是这样做的,它与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

Bash 4+示例。注意:当单词包含空格等时,不使用引号会导致问题。始终在Bash中引用,IMO。

以下是Bash 4+中的一些示例:

示例1,检查字符串中的“yes”(不区分大小写):

    if [[ "${str,,}" == *"yes"* ]] ;then

示例2,检查字符串中的“yes”(不区分大小写):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

示例3,检查字符串中的“yes”(区分大小写):

     if [[ "${str}" == *"yes"* ]] ;then

示例4,检查字符串中的“yes”(区分大小写):

     if [[ "${str}" =~ "yes" ]] ;then

示例5,完全匹配(区分大小写):

     if [[ "${str}" == "yes" ]] ;then

示例6,完全匹配(不区分大小写):

     if [[ "${str,,}" == "yes" ]] ;then

例7,完全匹配:

     if [ "$a" = "$b" ] ;then

好好享受。

你有比较问题吗?(如下所示?)

var="true"if [[ $var == "true" ]]; then# It 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 inequalityfi