我想两个字符串在一个简单的shell脚本进行比较。 我用/bin/sh代替/bin/bash,和调试的无数个小时后,原来的sh(实际上是短划线)不能处理的代码块:

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

什么是使用/bin/sh比较字符串可移植的方式?我知道我可以随时通过反其道而行之!=,但我想知道一个更清洁,可移植的方式。

有帮助吗?

解决方案

dash是一个非常严格的POSIX壳,如果在工作dash它几乎是一定的,将在其他POSIX壳工作。

尝试:

if [ "$var" = "string" ]
then
    some_command
fi

其他提示

为什么会出现即使您的脚本将被“错误的”壳运行的可能性?我想你可以做,通过使用标准的SH-砰线在你的脚本的顶级产品的先决条件:

#!/bin/bash

即使用户的使用不同的外壳,其他弹通常仍然存在,如果没有,简单地抱怨和状态,他们是一个预REQ。

完全同样的方式,一个特定的内核级,或AWK的存在,可为预先-REQ。

有关您的具体问题,相信无论shbash允许单个“=”将被用于字符串比较 - 这是POSIX行为:

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

yes

使用=代替==。比较受到测试处理(1)。 /usr/bin/[通常与/usr/bin/test的链接。唯一的区别是,如果在一个外壳脚本中使用[,所述]需要为好。

需要注意的是bash有一个内置的test / [,所以它实际上并没有使用/usr/bin/test

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

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

可以使用AWK

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top