41

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

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

使用 比较字符串的可移植方法是什么/bin/sh?我知道我总是可以通过使用 != 来做相反的事情,但我想知道一种更清洁、更便携的方式。

4

5 回答 5

59

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

尝试:

if [ "$var" = "string" ]
then
    some_command
fi
于 2009-07-07T00:33:02.200 回答
9

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

#!/bin/bash

即使用户使用不同的 shell,其他 shell 通常仍然存在,如果没有,只需抱怨并声明它们是 pre-req。

与特定内核级别或 awk 的存在完全相同的方式可以是 pre-req。

对于您的具体问题,我相信shbash允许将单个 '=' 用于字符串比较 - 这是 POSIX 行为:

if [ "a" = "a" ] ; then
    echo yes
fi

yes
于 2009-07-07T00:27:25.837 回答
4

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

请注意,bash 有一个内置test/ [,因此它实际上并不使用/usr/bin/test.

于 2009-07-07T00:32:19.097 回答
1

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

% 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'

好的,所以上面的内容并不是超级有用,但也考虑到您可以使用类似的方法来测试here-documents中的变量,必要时进行内联变量分配(在一定程度上......),甚至就像编写第一个语句的更短(更快!)的方法一样。

[ ! "${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
%
于 2014-02-15T07:04:31.683 回答
-3

你可以使用 awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
于 2009-07-07T01:52:41.987 回答