Verifique se a string de várias linhas corresponde à expressão

0

Eu tenho isso:

declare_result=$(declare -f cd);

que produz este verbatim:

cd () 
{ 
    prev_cd "$@";
    echo "botch cd hook invoked.";
    run_botch
}

como posso verificar se $ declare_result corresponde a "run_botch"?

é tão simples como:

if [[ "$declare_result" == *"run_botch"* ]];

se isso não funcionar para sequências de várias linhas? Essa é minha principal preocupação é que não funcionará para strings separadas por novas linhas.

    
por Alexander Mills 02.05.2018 / 08:22

2 respostas

0

Seu exemplo funciona bem. bash não tem problema em corresponder a uma string que contém novas linhas incorporadas.

Com um padrão como *$'run_botch\n'* , ele pode até corresponder à nova linha após a string run_botch .

    
por 02.05.2018 / 08:39
0

Sim, funcionará corretamente.

a=$(declare -f cd);

e

b='cd () 
{ 
    prev_cd "$@";
    echo "botch cd hook invoked.";
    run_botch
}'

combina corretamente:

[[ "$a" == "$b" ]] && echo match

Não há necessidade de asteriscos.

Uma advertência, porém, a expansão de comando de a=$(declare -f cd) está removendo todo e qualquer espaço em branco (com um IFS padrão). É por isso que a variável b termina com:

}'

e não com

}
'

que fará a correspondência (exata) falhar.

Se você quiser testar se alguma string existe dentro da variável a , você precisa dos asteriscos:

[[ $a == *run_botch* ]] && echo match

As aspas são opcionais (no lado esquerdo), no lado direito aspas podem alterar a interpretação da string.

    
por 02.05.2018 / 08:44