Quiero escribir un script de shell de Unix que haga varias lógicas si hay una cadena dentro de otra cadena. Por ejemplo, si estoy en una carpeta determinada, bifurca. ¿Podría alguien decirme cómo lograr esto? Si es posible, me gustaría hacer que esto no sea específico de shell (es decir, no solo bash), pero si no hay otra forma de hacerlo.
#!/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
es redundante; solo puedes usar$PWD
.Respuestas:
Aquí hay otra solución. Utiliza la expansión de parámetros de la subcadena POSIX , por lo que funciona en Bash, Dash, KornShell (ksh), Z shell (zsh), etc.
Una versión funcionalizada con algunos ejemplos:
fuente
substring="$( printf '%q' "$2" )"
salva el día.[[ $haystack == *"My needle"* ]]
[]
. Vea mi respuesta stackoverflow.com/a/54490453/712666 .Shell POSIX puro:
Los shells extendidos como ksh o bash tienen mecanismos de combinación sofisticados, pero el estilo antiguo
case
es sorprendentemente poderoso.fuente
Lamentablemente, no conozco una manera de hacer esto en sh. Sin embargo, usando bash (a partir de la versión 3.0.0, que es probablemente lo que tiene), puede usar el operador = ~ de esta manera:
Como un bono adicional (y / o una advertencia, si sus cadenas tienen caracteres divertidos), = ~ acepta expresiones regulares como el operando correcto si omite las comillas.
fuente
[[ test =~ "test.*" ]]
frente[[ test =~ test.* ]]
.fuente
grep -q "$2"
agrep -q "$2" > /dev/null
para evitar salidas no deseadas.Aquí hay un enlace a varias soluciones de su problema.
Este es mi favorito, ya que tiene el sentido más legible para los humanos:
El método comodín estrella
fuente
sh
recibí "operando desconocido" con esto. Sin embargo, funciona con Bash.[[
no es POSIXfuente
Hay expresiones regulares de Bash . O hay 'expr':
fuente
-> salida: la cadena 1 contiene la cadena 2
fuente
Consulte la página de manual del programa 'prueba'. Si solo está probando la existencia de un directorio, normalmente haría algo así:
Si realmente está tratando de hacer coincidir una cadena, también puede usar reglas de expansión bash y comodines:
Si necesita hacer algo más complejo, deberá usar otro programa como expr.
fuente
En casos especiales en los que desea saber si una palabra está contenida en un texto largo, puede recorrer el texto largo con un bucle.
Esto es pura cáscara de Bourne.
fuente
Si desea un método solo para ksh que sea tan rápido como "prueba", puede hacer algo como:
Funciona eliminando la aguja en el pajar y luego comparando la longitud de la cuerda de los pajar viejos y nuevos.
fuente
test
? Al igual que enreturn [ ${#haystack} -eq ${#1} ]
?