Pergunta

Eu estou tentando comparar duas cadeias de caracteres em um simples shell script.Eu estava usando /bin/sh em vez de /bin/bash, e depois de incontáveis horas de depuração, acontece sh (que na verdade é traço) não pode lidar com este bloco de código:

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

O que é uma forma portátil para comparar cadeias de caracteres usando /bin/sh?Eu sei que posso sempre fazer o oposto usando !=, mas eu estou querendo saber sobre um limpador de forma portátil.

Foi útil?

Solução

dash é um shell Posix muito rigoroso, se funcionar em dash É quase certo que funcionaria em outro shell Posix.

Tentar:

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

Outras dicas

Por que existe até a possibilidade de que seu script seja executado pelo shell "errado"? Eu acho que você poderia fazer com que um pré-requisito do seu produto usando a linha SH-bang padrão no topo do seu script:

#!/bin/bash

Mesmo se um usuário usos Uma concha diferente, as outras conchas geralmente ainda estão lá e, se não, simplesmente reclamam e afirmam que são um pré-req.

Exatamente da mesma maneira que um nível específico do kernel, ou a existência de AWK, pode ser um pré-req.

Para sua pergunta específica, acredito que ambos sh e bash Permita que o único '=' seja usado para comparações de string - que é o comportamento do POSIX:

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

yes

Usar = ao invés de ==. As comparações são tratadas pelo teste (1). /usr/bin/[ normalmente é um link para /usr/bin/test . A única diferença é que, se você usar [ em um script de concha, o ] é necessário também.

Observe que Bash tem um embutido test/[, então não usa na verdade /usr/bin/test.

As respostas já postadas são certamente correto, mas pode ser interessante notar que, ocasionalmente, parâmetro de expansão pode servir o mesmo propósito, com talvez alguma flexibilidade adicional.

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

Ok, então o que está acima não é super-útil como é, mas considere também que você pode usar os métodos similares para o teste de variáveis no aqui-documentos, na linha de atribuições de variável, se necessário (para um grau...), ou mesmo apenas como um mais curto (e rápido!) meios de escrever a sua primeira instrução.

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

Ou até mesmo...

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

Possivelmente até mesmo...

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

você pode usar awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top