web-dev-qa-db-fra.com

bash scripting: si les arguments sont égaux à cette chaîne, définissez une variable comme cette chaîne

Je fais un script bash et maintenant j'ai un appel de variable source et un tableau appelé samples, comme ceci:

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

comme je veux augmenter le nombre de sources (et chaque source a ses propres échantillons), j'ai essayé d'ajouter quelques arguments pour le faire. J'ai essayé ceci:

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

mais quand j'ai exécuté mon script source countries.sh country cela n'a pas fonctionné. Qu'est-ce que je fais mal?

195
Alejandro

N'oubliez pas les espaces:

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

Vous pouvez utiliser des opérateurs "=" ou "==" pour la comparaison de chaînes dans bash. Le facteur important est l'espacement entre parenthèses. La méthode appropriée consiste pour les crochets à contenir un espacement à l'intérieur, et les opérateurs à un espacement autour. Dans certains cas, différentes combinaisons fonctionnent; Cependant, ce qui suit est destiné à être un exemple universel.

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

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

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

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

De plus, les doubles crochets sont traités légèrement différemment par rapport aux crochets 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).

J'espère que ça aide!

162
Vyke

Il semble que vous cherchiez à analyser les arguments de la ligne de commande dans votre script bash. J'ai récemment recherché cela moi-même. Je suis tombé sur le texte suivant qui, je pense, vous aidera à analyser les arguments:

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

J'ai ajouté l'extrait ci-dessous en tant que 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 -t test -r serveur -p mot de passe -v

10
ioneyed

À première vue, vous effectuez une assignation = dans votre instruction if au lieu d'une comparaison == En gros, vous devez effectuer les opérations suivantes:

mysource=""
samples=("")


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

C'EST À DIRE:

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

Est-ce que c'est ce que tu veux?

4
hmontoliu