String 如何在Bash中比较字符串

String 如何在Bash中比较字符串,string,bash,String,Bash,如何将变量与字符串进行比较(如果匹配,则执行操作)?在if语句中使用变量 如果您想在它们不匹配时执行某些操作,请将=替换为=。您可以在各自的文档中阅读更多关于和的信息 为什么我们在$x周围使用引号? 您希望在$x周围加引号,因为如果它为空,则Bash脚本会遇到语法错误,如下所示: if [ = "valid" ]; then 非标准使用==运算符 请注意,Bash允许使用==与[相等,但是 使用第一种情况,其中,$x周围的引号是可选的: if [[ "$x" == "valid" ]]; t

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

在if语句中使用变量 如果您想在它们不匹配时执行某些操作,请将
=
替换为
=。您可以在各自的文档中阅读更多关于和的信息

为什么我们在
$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