necesito para comparar cadenas en la shell:¿Cómo comparo las cadenas en Bourne Shell?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
Pero, obviamente, el "*" no funciona en Shell. ¿Hay una manera de hacerlo?
necesito para comparar cadenas en la shell:¿Cómo comparo las cadenas en Bourne Shell?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
Pero, obviamente, el "*" no funciona en Shell. ¿Hay una manera de hacerlo?
bash
solución más corta:
if [[ "$var1" = "mtu "* ]]
de [[ ]]
no recibe Glob-expandida, a diferencia de [ ]
Bash (el cual debe, por razones históricas).
bash --posix
Oh, he publicado demasiado rápido. Bourne shell, no Bash ...
if [ "${var1:0:4}" == "mtu " ]
${var1:0:4}
significa los cuatro primeros caracteres del $var1
.
/bin/sh
Ah, lo siento. La emulación POSIX de Bash no va lo suficientemente lejos; un verdadero shell original de Bourne no tiene ${var1:0:4}
. Necesitarás algo como la solución de mstrobl.
if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]
Utilice las herramientas de Unix. El programa cut
acortará felizmente una cadena.
if [ "$(echo $var1 | cut -c 4)" = "mtu " ];
... debe hacer lo que quiera.
Puede llamar expr
para que coincida con cadenas contra expresiones regulares desde scripts Bourne Shell. El siguiente parece funcionar:
#!/bin/sh
var1="mtu eth0"
if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
echo "match"
fi
yo haría lo siguiente:
# Removes anything but first word from "var1"
if [ "${var1%% *}" = "mtu" ] ; then ... fi
O:
# Tries to remove the first word if it is "mtu", checks if we removed anything
if [ "${var1#mtu }" != "$var1" ] ; then ... fi
me gusta usar la declaración de caso para comparar cadenas.
Un ejemplo trivial es
case "$input"
in
"$variable1") echo "matched the first value"
;;
"$variable2") echo "matched the second value"
;;
*[a-z]*) echo "input has letters"
;;
'') echo "input is null!"
;;
*[0-9]*) echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
;;
*) echo "Some wacky stuff in the input!"
esac
he hecho cosas locas como
case "$(cat file)"
in
"$(cat other_file)") echo "file and other_file are the same"
;;
*) echo "file and other_file are different"
esac
y que funciona también, con algunas limitaciones, como por ejemplo los archivos no pueden ser más de un par megabytes y el shell simplemente no ve nulos, por lo que si un archivo está lleno de nulos y el otro no tiene ninguno, (y ninguno tiene nada más), esta prueba no verá ninguna diferencia entre los dos.
No uso la comparación de archivos como un ejemplo serio, solo un ejemplo de cómo la sentencia case es capaz de hacer una coincidencia de cadenas mucho más flexible que la disponible con test o expr u otras expresiones de shell similares.
En Bourne shell, si quiero comprobar si una cadena contiene otra cadena:
if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then
Incluya echo ${String} | grep -c ${Substr}
con dos `
acentos abiertos:
Para comprobar si la subcadena es al principio o en el fin:
if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then
'$ {var1: 0: 4}' - ¿de dónde obtuviste esa sintaxis? Definitivamente no es POSIX. –
Mi versión de corte dice que las posiciones están numeradas comenzando en 1. '' cut -c 1-4'' o '' cut -c -4'' devuelve el valor correcto aquí. – jotr