2012-03-15 17 views
122

que estoy haciendo una secuencia de comandos bash y ahora tengo una llamada variable de source y una matriz llamada samples, así:secuencias de comandos bash: si los argumentos es igual a esta cadena, definir una variable como esta cadena

source='country' 
samples=(US Canada Mexico...) 

como quiero expandir el número de fuentes (y cada fuente tiene sus propias muestras) intenté agregar algunos argumentos para hacer esto. He intentado esto:

source="" 
samples=("") 
if [ $1="country" ]; then 
    source="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 

pero cuando me encontré con mi guión source countries.sh country, no funcionó. ¿Qué estoy haciendo mal?

+2

¿cómo no funciona? Cuando lo ejecutas, obtienes un error, o dice "intenta de nuevo", ¿o alguna otra cosa? –

+2

sí, puede pensar 'la pregunta es muy directa'. pero has estado pensando en esto por un tiempo. Considere editar su pregunta para incluir los resultados requeridos y los mensajes de error que reciba. +1 por probar algo y un buen formato de la pregunta. buena suerte. – shellter

+0

¿Por qué este código es el mismo que la solución propuesta y aceptada? Eso es confuso ... Supongo que la pregunta inicial no tenía los espacios justo después del corchete de apertura y antes del corchete de cierre de la oración if. – Stef

Respuesta

234

no se olvide de los espacios:

source="" 
samples=("") 
if [ $1 = "country" ]; then 
    source="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 
+65

¡No puedo creer que gaste tres horas en esto, y fue solo un problema de espacios !!!! ... GRACIAS @Alex – Alejandro

+1

¿Por qué usas 'samples =" US Canada Mexico ... "' después de presentar la matriz creación antes de 'samples = (US Canada Mexico ...)'? –

+1

y agregar == en lugar de = – Filippos

4

A primera vista, que están haciendo una cita = en su sentencia if en lugar de una comparación de == Básicamente, usted tendrá que hacer:

mysource="" 
samples=("") 


if [ "$1" == "country" ]; then 
    mysource="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 

IE:

~$ source /tmp/foo.sh country 
~$ echo $samples 
US Canada Mexico... 

es eso lo que ¿querer?

+4

No, dentro de '[]' una sola '=' es una comparación de cadenas, no una asignación. –

+0

@hmontoliu: '==' no es necesario. Para comparar cadenas, usa '='.Pruebe '[[" A "=" A "]] && echo" equal "|| echo "diferente" ' – sgibb

+0

Cool! Una cosa para aprender :-) – hmontoliu

7

Parece que está buscando analizar argumentos de línea de comandos en su secuencia de comandos bash. He buscado esto recientemente yo mismo. Me encontré con lo siguiente, que creo que le ayudará a analizar los argumentos:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

he añadido el siguiente fragmento de código como tl; dr

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing. 
while getopts “ht:r:p:v” OPTION 
do 
    case $OPTION in 
     h) 
      usage 
      exit 1 
      ;; 
     t) 
      TEST=$OPTARG 
      ;; 
     r) 
      SERVER=$OPTARG 
      ;; 
     p) 
      PASSWD=$OPTARG 
      ;; 
     v) 
      VERBOSE=1 
      ;; 
     ?) 
      usage 
      exit 
      ;; 
    esac 
done 

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]] 
then 
    usage 
    exit 1 
fi 

./script.sh prueba -t servidor -r -p contraseña -v

105

Puede usar los operadores "=" o "==" para la comparación de cadenas en bash. El factor importante es el espacio entre corchetes. El método correcto es que los corchetes contengan espaciado interno y que los operadores contengan espaciado. En algunos casos, funcionan diferentes combinaciones; sin embargo, lo siguiente está destinado a ser un ejemplo universal.

if [ "$1" == "something" ]; then  ## GOOD 

if [ "$1" = "something" ]; then  ## GOOD 

if [ "$1"="something" ]; then  ## BAD (operator spacing) 

if ["$1" == "something"]; then  ## BAD (bracket spacing) 

Además, tenga en dobles corchetes se manejan de forma ligeramente diferente en comparación con los soportes individuales ...

if [[ $a == z* ]]; then # True if $a starts with a "z" (pattern matching). 
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching). 

if [ $a == z* ]; then  # File globbing and word splitting take place. 
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching). 

espero que ayude!

Cuestiones relacionadas