si los argumentos son iguales a esta cadena, defina una variable como esta cadena

Resuelto Alejandro asked hace 12 años • 3 respuestas

Estoy haciendo un script bash y ahora tengo una llamada de variable sourcey una matriz llamada samples, como esta:

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

Como quiero ampliar el número de fuentes (y cada fuente tiene sus propias muestras), intenté agregar algunos argumentos para hacer esto. Probé esto:

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

pero cuando ejecuté mi script source countries.sh countryno funcionó. ¿Qué estoy haciendo mal?

Alejandro avatar Mar 16 '12 03:03 Alejandro
Aceptado

No te olvides de los espacios:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
Alex L avatar Mar 15 '2012 20:03 Alex L

Puede utilizar los operadores " =" o " ==" para comparar cadenas en bash. El factor importante es el espacio entre corchetes. El método adecuado es que los corchetes contengan espacios dentro y los operadores contengan espacios alrededor. En algunos casos funcionan diferentes combinaciones; sin embargo, lo siguiente pretende 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 cuenta que los corchetes dobles se manejan de manera ligeramente diferente en comparación con los corchetes simples...

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).
Vyke avatar Aug 13 '2013 22:08 Vyke