代码之家  ›  专栏  ›  技术社区  ›  LiraNuna

bash、dash和string比较

  •  27
  • LiraNuna  · 技术社区  · 15 年前

    我尝试在一个简单的shell脚本中比较两个字符串。 我在用 /bin/sh 而不是 /bin/bash 经过无数小时的调试,结果显示sh(实际上是dash)无法处理这段代码:

    if [ "$var" == "string" ]
    then
        do something
    fi
    

    什么是比较字符串的可移植方法 /bin/SH ?我知道我可以用做相反的事情!,但我想知道一种更干净、更轻便的方法。

    5 回复  |  直到 15 年前
        1
  •  42
  •   cwd    9 年前

    dash 是一个非常严格的posix shell,如果它在 短跑 几乎可以肯定,它可以在其他posix shell中工作。

    尝试:

    if [ "$var" = "string" ]
    then
        some_command
    fi
    
        2
  •  9
  •   paxdiablo    15 年前

    为什么您的脚本可能会被“错误的”shell运行?我认为您可以通过使用脚本顶部的标准sh bang行,将其作为产品的先决条件:

    #!/bin/bash
    

    即使用户 使用 另一个shell,其他shell通常仍然存在,如果没有,只需抱怨并声明它们是一个先决条件。

    与特定内核级别或awk的存在完全相同,它可以是先决条件。

    对于你的具体问题,我相信两者都是 sh bash 允许单个“=”用于字符串比较-即POSIX行为:

    if [ "a" = "a" ] ; then
        echo yes
    fi
    
    yes
    
        3
  •  3
  •   swdev Jonathan Leffler    7 年前

    使用 = 而不是 == . 比较由测试(1)处理。 /usr/bin/[ 通常是指向 /usr/bin/test . 唯一的区别是如果你使用 [ 在shell脚本中, ] 也是必需的。

    注意bash有一个内置的 test / [ ,所以它实际上不使用 /UR/BIN/检验 .

        4
  •  1
  •   mikeserv    10 年前

    已经发布的答案肯定是正确的,但是值得注意的是,偶尔参数扩展可以达到相同的目的,也许还有一些额外的灵活性。

    % p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
    % string1='some stuff about things\c'
    % string2='some different stuff maybe'
    % notvar="$string1" p
    > 'some different stuff maybe'
    % notvar="$string2" p
    > 'some stuff about things'
    

    好的,所以上面的方法并不是非常有用,但是你也可以考虑使用类似的方法来测试文档中的变量,如果需要的话,可以使用在线变量赋值(在某种程度上…),甚至可以使用更短(更快!)写第一句话的方法。

    [ ! "${var##"string"}" ] && _MATCH || _NOMATCH
    

    甚至…

    [ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE
    

    甚至可能…

    % p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
    > }<<HEREDOC
    > ${in="${1##*"${2}"*}"}
    > ${in:-
    >     ${in="${1##"${2}"}"}
    >     ${in:-${var_chk=all}
    >     ${var_chk=some}
    > }
    > HEREDOC
    %
    
        5
  •  -3
  •   ghostdog74    15 年前

    你可以使用AWK

    awk 'BEGIN{
     string1="test"
     string2="tes1t"
     if(s1==s2){
        print "same string"
     }else{
        print "not same"
     }
    }'