bash, traço e comparação de seqüência de caracteres
-
11-09-2019 - |
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.
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"
}
}'