2008-10-08 5 views

Respuesta

11

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 " ] 
+0

'$ {var1: 0: 4}' - ¿de dónde obtuviste esa sintaxis? Definitivamente no es POSIX. –

+1

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

18

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

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

... debe hacer lo que quiera.

+1

sí, pero un poco pesado –

+0

Creo que ya que está comparando dos cadenas aquí debería ser "=" o "==", no "-eq". – William

+0

'' cut -c 4'' corta el cuarto carácter: '' cut -c -4'' corta los primeros cuatro caracteres. – jotr

0

O, como un ejemplo de que el operador = ~:

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

¿Qué tipo de shell es ese? – ADEpt

+0

Bash 3.1 y superior tiene [[a = ~. *]]. Pero * dentro de las comillas es incorrecto para 3.2 y mayor sin shopt -s compat31. – ephemient

+0

No es POSIX. –

6

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 
3

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 
1

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.

1

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 
Cuestiones relacionadas