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

225

Je fais un script bash et maintenant j'ai un appel de variable sourceet 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 countrycela n'a pas fonctionné. Qu'est-ce que je fais mal?

Alejandro
la source
2
comment ça marche pas? Lorsque vous l'exécutez, vous obtenez une erreur, ou il dit "réessayer", ou autre chose?
evil otto
2
oui, vous pensez peut-être que «la question est très simple». mais vous y réfléchissez depuis un moment. Veuillez envisager de modifier votre question pour inclure les sorties requises et tous les messages d'erreur que vous recevez. +1 pour avoir réellement essayé quelque chose et un bon formatage de la question. bonne chance.
shellter
Pourquoi ce code est-il le même que la solution proposée et acceptée? C'est déroutant ... Je suppose que la question initiale n'avait pas les espaces juste après la parenthèse ouvrante et avant la parenthèse fermante de la phrase if?
Stef
6
@Stef si vous regardez de près, $1="country"vs$1 = "country"
Will

Réponses:

413

N'oubliez pas les espaces:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
Alex L
la source
121
Je n'arrive pas à croire que j'y passe trois heures, et ce n'était qu'un problème d'espace !!!! ... MERCI @Alex
Alejandro
1
Pourquoi utilisez-vous samples="US Canada Mexico..."après avoir introduit la création de tableau avant samples=(US Canada Mexico...)?
utilisateur inconnu
10
J'ai rencontré des problèmes avec cela lorsque la variable de gauche était une chaîne vide. Le correctif était if [ "$1" = "country" ]; then.
andrewb
8
C'est tout. Bash obtient officiellement mon vote pour être le langage de commande le plus obsolète mais encore utilisé. La syntaxe est tellement non intuitive que ça fait mal. Vraiment pas de place pour ça en 2016+. Auteurs @Systemd: pouvez-vous faire de la "construction d'un shell Linux qui ne suce pas" votre prochain projet? Je te jette de l'argent.
masi
3
@masi parfois, je pense que l'intention originale d'Unix était "la sécurité de l'emploi à travers l'obscurité". si les outils étaient énigmatiques à utiliser, difficiles à comprendre et généralement hors de portée des grands non lavés sans la connaissance intérieure transmise du maître au padwan, cela garantirait qu'il y aurait toujours du travail pour ceux qui sont "au courant". cette philosophie est évidente dans l'ensemble de la construction "RFC", et le langage fleuri utilisé dans les documents homme, qui, tout en vous disant techniquement comment utiliser les outils, étaient vraiment là pour répondre à une exigence d'avoir documenté les outils. peu de choses ont changé.
non synchronisé
184

Vous pouvez utiliser les opérateurs "=" ou "==" pour la comparaison de chaînes dans bash. Le facteur important est l'espacement entre les crochets. La méthode appropriée consiste à ce que les crochets contiennent l'espacement à l'intérieur et les opérateurs à contenir l'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)

Notez également que les crochets doubles sont traités légèrement différemment des 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!

Vyke
la source
12

Il semble que vous cherchiez à analyser les arguments de ligne de commande dans votre script bash. J'ai moi-même cherché cela récemment. Je suis tombé sur les éléments suivants qui, je pense, vous aideront à 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

ioneyed
la source