scripts script resueltos pasar parametros operaciones manejo español ejercicios ejemplos comandos cadenas aritmeticas shell sh posix

resueltos - shell script ejemplos



¿Cómo comparo las cadenas en Bourne Shell? (7)

Necesito comparar cadenas en shell:

var1="mtu eth0" if [ "$var1" == "mtu *" ] then # do something fi

Pero obviamente el "*" no funciona en Shell. ¿Hay una manera de hacerlo?


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


O, como un ejemplo del operador = ~ :

if [[ "$var1" =~ "mtu *" ]]


Puede llamar a expr para hacer coincidir cadenas con expresiones regulares desde los scripts de Bourne Shell. El siguiente parece funcionar:

#!/bin/sh var1="mtu eth0" if [ "`expr /"$var1/" : /"mtu .*/"`" != "0" ];then echo "match" 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 eso también funciona, con algunas limitaciones, como que los archivos no pueden tener más de un par de 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 lo tiene). cualquier otra cosa), 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 el enunciado de caso es capaz de hacer una correspondencia de cadenas mucho más flexible que la disponible con test o expr u otras expresiones de shell similares.


Usa las herramientas de Unix. El cut programa acortará felizmente una cadena.

if [ "$(echo $var1 | cut -c 4)" = "mtu " ];

... debería hacer lo que quieras.


bash

La solución más corta:

if [[ "$var1" = "mtu "* ]]

Bash''s [[ ]] no obtiene glob-expanded, a diferencia de [ ] (que debe, por razones históricas).

bash --posix

Oh, publiqué demasiado rápido. Bourne Shell, no Bash ...

if [ "${var1:0:4}" == "mtu " ]

${var1:0:4} significa los primeros cuatro caracteres de $var1 .

/bin/sh

Oh, 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 " ]


En shell Bourne, si quiero verificar si una cadena contiene otra cadena:

if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then

Encierre echo ${String} | grep -c ${Substr} echo ${String} | grep -c ${Substr} con dos ` palos de retroceso:

Para verificar si la subcadena está al principio o al final:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then ... if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then