¿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 hello
con 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
. Laif
declaració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
-i
opción de grep dice que ignore el caso.La
-q
opción dice no emitir salida y salir después del primer partido.La
-F
opció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.sh
no estábash
en todos los sistemas basados en Linux.==
no está respaldado porash
(en el quesh
se 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/sh
está mal. Si asumeksh
obash
sintaxis, actualice el#!
correspondiente.Puede hacer una coincidencia de subcadenas sin distinción entre mayúsculas y minúsculas al
bash
usar el operador regex=~
si configura lanocasematch
opción de shell. Por ejemplofuente
[[ XYZ == xyz ]] && echo "match"
=>match
Para una búsqueda de cadenas entre mayúsculas y minúsculas del valor de la variable
needle
en 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
tr
en 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
tr
de BusyBox no admite la sintaxis; puedes usar en su lugar. BusyBox no admite configuraciones regionales que no sean ASCII.[:CLASS:]
tr a-z A-Z
En 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 | tr
hace 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<<EOF
es para un documento aquí. Noprintf
oecho
menos que sea absolutamente necesario hacerlo.<<<
operador: ksh, bash, zsh, pero no sh simple. Y es bastante cerca de las tuberías deprintf
en términos de cómo funciona: no hay el mismo número de llamadas afork
yexecve
(suponiendo queprintf
está 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.