Eu quero escrever um script de shell Unix que faça várias lógicas se houver uma string dentro de outra string. Por exemplo, se eu estiver em uma determinada pasta, ramifique. Alguém poderia me dizer como fazer isso? Se possível, eu gostaria de tornar isso não específico do shell (ou seja, não apenas do bash), mas se não houver outra maneira de fazer isso.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
CURRENT_DIR
é redundante; você pode apenas usar$PWD
.Respostas:
Aqui está mais uma solução. Ele usa a expansão de parâmetro de substring POSIX , para que ele funcione no Bash, Dash, KornShell (ksh), shell Z (zsh), etc.
Uma versão funcionalizada com alguns exemplos:
fonte
substring="$( printf '%q' "$2" )"
salva o dia.[[ $haystack == *"My needle"* ]]
[]
. Veja minha resposta stackoverflow.com/a/54490453/712666 .Shell POSIX puro:
Os shells estendidos, como o ksh ou o bash, têm mecanismos de correspondência sofisticados, mas o estilo antigo
case
é surpreendentemente poderoso.fonte
Infelizmente, não conheço uma maneira de fazer isso no sh. No entanto, usando o bash (a partir da versão 3.0.0, que provavelmente é o que você possui), você pode usar o operador = ~ assim:
Como um bônus adicional (e / ou um aviso, se suas strings tiverem caracteres engraçados), = ~ aceita expressões regulares como o operando certo se você deixar de fora as aspas.
fonte
[[ test =~ "test.*" ]]
vs.[[ test =~ test.* ]]
.fonte
grep -q "$2"
paragrep -q "$2" > /dev/null
para evitar saída indesejada.Aqui está um link para várias soluções do seu problema.
Este é o meu favorito, pois faz o sentido legível mais humano:
O método curinga da estrela
fonte
sh
recebi "operando desconhecido" com isso. Funciona com o Bash.[[
não é POSIXfonte
Há expressões regulares do Bash . Ou há 'expr':
fonte
-> saída: a sequência 1 contém a sequência 2
fonte
Veja a página de manual do programa 'test'. Se você está apenas testando a existência de um diretório, normalmente faria algo assim:
Se você está realmente tentando corresponder a uma string, também pode usar regras de expansão bash e curingas:
Se você precisar fazer algo mais complexo, precisará usar outro programa como o expr.
fonte
Em casos especiais em que você deseja descobrir se uma palavra está contida em um texto longo, é possível percorrer o texto longo com um loop.
Isso é pura casca de Bourne.
fonte
Se você quiser um método apenas do ksh que seja tão rápido quanto "test", poderá fazer algo como:
Ele funciona excluindo a agulha no palheiro e comparando o comprimento da corda dos antigos e novos.
fonte
test
? Como emreturn [ ${#haystack} -eq ${#1} ]
?