Como eu comparo uma variável a uma string (e faço alguma coisa se ela corresponder)?
Como eu comparo uma variável a uma string (e faço alguma coisa se ela corresponder)?
Respostas:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Se você quiser fazer algo quando não corresponder, substitua =
por !=
. Você pode ler mais sobre operações de string e operações aritméticas na respectiva documentação.
$x
?Você quer as aspas $x
, porque se estiver vazio, seu script Bash encontrará um erro de sintaxe, como mostrado abaixo:
if [ = "valid" ]; then
==
operadorObserve que o Bash permite ==
ser usado para igualdade com [
, mas isso não é padrão .
Use o primeiro caso em que as aspas $x
são opcionais:
if [[ "$x" == "valid" ]]; then
ou use o segundo caso:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Alterar isso para ["$ 1" = "on"] resolveu o problema.
=
e não dois.
[ $x -eq "valid" ]
. -eq
é o operador de comparação para números inteiros, não seqüências de caracteres.
["x$yes" == "xyes"]
, que é o prefixo da variável e da string literal com um x
? Isso é uma relíquia dos velhos tempos ou é realmente necessário em algumas situações?
Ou, se você não precisar de outra cláusula:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
pode falhar.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
é mais eficiente do que ( echo invalid && false )
, pois evita pagar por um subshell desnecessário.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Notas:
if
e [
e ]
são importantes>
e <
são operadores de redirecionamento, portanto, escape-o com \>
e \<
respectivamente para cadeias.$a
na verdade, o " "
envolvia como parte do valor literal da string, portanto, tive que usar o caractere de escape $b
para comparar os valores. Consegui encontrar isso após a execução bash -x ./script.sh
, o sinalizador -x permite que você veja o valor de cada execução e ajuda na depuração.
Para comparar seqüências de caracteres com caracteres curinga, use
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
nos caracteres curinga. (btw: +1 para curingas!)
$stringB
deve ser citado (e, aliás, do lado esquerdo não precisa ser citado): if [[ $stringA = *"$stringB"* ]]; then
.
Eu tenho que discordar de um dos comentários em um ponto:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
É só que parece que um, hum, o não iniciado ...
Ele usa padrões comuns como uma linguagem, de certa forma;
E depois que você aprendeu o idioma.
É uma expressão lógica simples, com uma parte especial: avaliação lenta dos operadores lógicos.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Cada parte é uma expressão lógica; o primeiro pode ser verdadeiro ou falso, os outros dois são sempre verdadeiros.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Agora, quando é avaliado, o primeiro é verificado. Se for falso, então o segundo operando da lógica e &&
depois não é relevante. O primeiro não é verdadeiro, portanto, não pode ser o primeiro e o segundo, de qualquer maneira.
Agora, nesse caso, é o primeiro lado da lógica ou ||
falso, mas pode ser verdade se o outro lado - a terceira parte - for verdadeiro.
Portanto, a terceira parte será avaliada - principalmente escrevendo a mensagem como efeito colateral. (Tem o resultado 0
para true, que não usamos aqui)
Os outros casos são semelhantes, mas mais simples - e - eu prometo! são - podem ser - fáceis de ler!
(Eu não tenho um, mas acho que ser um veterano do UNIX com barba grisalha ajuda muito nisso.)
... && ... || ...
é geralmente desaprovam (greybeard pena Unix veterano, você esteve errado por todo esse tempo), como não é semanticamente equivalente a if ... then ... else ...
. Não se preocupe, isso é uma armadilha comum .
... && ... || ...
é um padrão perfeitamente válido e um idioma comum do bash. O uso prescreve conhecimentos prévios (o que pode ser bom ter em mente se houver iniciantes na platéia), mas o OP tem o cabelo para provar que eles sabem como evitar as tampas de bueiros abertas.
você também pode usar caso de uso / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
antes do )
. A in
instrução é equivalente a then
em if
instruções. Você poderia argumentar que funciona sobre uma lista de padrões, onde cada lista tem sua própria declaração do que fazer, se você é do Python. Não gosto substring in string
, mas sim for item in list
. Use a *
como sua última declaração se desejar uma else
condição. Retorna no primeiro encontro.
O script a seguir lê de um arquivo chamado "testonthis" linha por linha e, em seguida, compara cada linha com uma string simples, uma string com caracteres especiais e uma expressão regular. Se não corresponder, o script imprimirá a linha, caso contrário não.
O espaço no Bash é muito importante. Portanto, o seguinte funcionará:
[ "$LINE" != "table_name" ]
Mas o seguinte não:
["$LINE" != "table_name"]
Então, por favor, use como está:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
mas porque [
é realmente um binário externo (como em which [
rendimentos algo como /usr/bin/[
)
Eu provavelmente usaria correspondências regexp se a entrada tiver apenas algumas entradas válidas. Por exemplo, apenas o "start" e "stop" são ações válidas.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Observe que eu minúscula a variável $ACTION
usando as vírgulas duplas. Observe também que isso não funcionará em versões muito antigas do bash por aí.
Bash 4+ exemplos. Nota: não usar aspas causará problemas quando as palavras contiverem espaços, etc. Sempre cite no Bash, IMO.
Aqui estão alguns exemplos no Bash 4+:
Exemplo 1, verifique 'yes' na string (não faz distinção entre maiúsculas e minúsculas):
if [[ "${str,,}" == *"yes"* ]] ;then
Exemplo 2, verifique 'yes' na string (não faz distinção entre maiúsculas e minúsculas):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Exemplo 3, verifique se 'yes' na string (diferencia maiúsculas de minúsculas):
if [[ "${str}" == *"yes"* ]] ;then
Exemplo 4, verifique se 'yes' na string (diferencia maiúsculas de minúsculas):
if [[ "${str}" =~ "yes" ]] ;then
Exemplo 5, correspondência exata (diferencia maiúsculas de minúsculas):
if [[ "${str}" == "yes" ]] ;then
Exemplo 6, correspondência exata (sem distinção entre maiúsculas e minúsculas):
if [[ "${str,,}" == "yes" ]] ;then
Exemplo 7, correspondência exata:
if [ "$a" = "$b" ] ;then
Aproveitar.
if [ "$a"="$b" ]
ou ele não funciona ... não pode ter espaços em torno dos iguais