¿Cómo puedo escribir un script de shell que haga una coincidencia de subcadena sin distinción entre mayúsculas y minúsculas de la salida del comando?
shell-script
shell
string
Miguel Roque
fuente
fuente

grep -i¿tal vez?bash, que es un superconjunto del estándar Unixsh. Puede comenzar mirando uno de estos: | 1 | | 2 | - solo para comprender cuál es el contexto real.Respuestas:
Primero, aquí hay un script de ejemplo simple que no ignora el caso:
Intente cambiar la cadena hola a la derecha, y ya no debería hacer eco
it works. Intente reemplazarecho hellocon un comando de su elección. Si desea ignorar mayúsculas y minúsculas, y ninguna cadena contiene un salto de línea, puede usar grep:La clave aquí es que está canalizando una salida de comando a
grep. Laifdeclaración prueba el estado de salida del comando más a la derecha en una tubería, en este caso grep. Grep sale con éxito si y solo si encuentra una coincidencia.La
-iopción de grep dice que ignore el caso.La
-qopción dice no emitir salida y salir después del primer partido.La
-Fopción dice tratar el argumento como una cadena en lugar de una expresión regular.Tenga en cuenta que el primer ejemplo utiliza lo que permite comparaciones directas y varios operadores útiles. La segunda forma solo ejecuta comandos y prueba su estado de salida.
[ expression ]fuente
==No es POSIX.shno estábashen todos los sistemas basados en Linux.==no está respaldado porash(en el queshse basan al menos muchos BSD y derivados de Debian), oposh, y las necesidades citadas enzsh. No tiene sentido duplicar el=.[es un comando para probar. No hay necesidad de desambiguar entre asignación y comparación aquí. Eso es diferente en(( a == b ))contra(( a = b)). Usar==un script que comienza con#! /bin/shestá mal. Si asumekshobashsintaxis, actualice el#!correspondiente.Puede hacer una coincidencia de subcadenas sin distinción entre mayúsculas y minúsculas al
bashusar el operador regex=~si configura lanocasematchopción de shell. Por ejemplofuente
[[ XYZ == xyz ]] && echo "match"=>matchPara una búsqueda de cadenas entre mayúsculas y minúsculas del valor de la variable
needleen el valor de la variablehaystack:Para una búsqueda de cadenas que no distingue entre mayúsculas y minúsculas, convierta ambas al mismo caso.
Tenga
tren cuenta que en GNU coreutils no admite configuraciones regionales multibyte (por ejemplo, UTF-8). Para hacer el trabajo con configuraciones regionales multibyte, use awk en su lugar. Si va a usar awk, puede hacer que haga la comparación de cadenas y no solo la conversión.El
trde BusyBox no admite la sintaxis; puedes usar en su lugar. BusyBox no admite configuraciones regionales que no sean ASCII.[:CLASS:]tr a-z A-ZEn bash (pero no sh), versión 4.0+, hay una sintaxis incorporada para la conversión de mayúsculas y una sintaxis más simple para la coincidencia de cadenas.
fuente
printf | trhace que mi cabeza gire. Siempre que sea posible, mantenga su invocación de comandos al mínimo ... dada una variable v, puede lograr lo mismo usandov=$(tr '[:lower:]' '[:upper:]' <<<$v). Para aquellos que nunca lo han visto antes,<<<es esencialmente una "variable aquí" como el uso de<<EOFes para un documento aquí. Noprintfoechomenos que sea absolutamente necesario hacerlo.<<<operador: ksh, bash, zsh, pero no sh simple. Y es bastante cerca de las tuberías deprintfen términos de cómo funciona: no hay el mismo número de llamadas aforkyexecve(suponiendo queprintfestá incorporado, que es el caso en la mayoría de los depósitos comunes); La diferencia es que<<<crea un archivo temporal en lugar de utilizar una tubería.<<<Es conveniente escribir pero no una mejora del rendimiento.