bash scripting: se l'argomento è uguale a questa stringa, definire una variabile come questa stringa


225

Sto facendo un po 'di script bash e ora ho ricevuto una chiamata variabile sourcee un array chiamato samples, in questo modo:

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

come voglio espandere il numero di fonti (e ogni fonte ha i suoi campioni) ho provato ad aggiungere alcuni argomenti per fare questo. Ho provato questo:

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

ma quando ho eseguito la mia sceneggiatura source countries.sh countrynon ha funzionato. Che cosa sto facendo di sbagliato?


2
come non funziona? Quando lo esegui, viene visualizzato un errore oppure viene visualizzato "riprova" o qualcos'altro?
evil otto

2
sì, potresti pensare "la domanda è molto semplice". ma ci stai pensando da un po '. Ti preghiamo di considerare di modificare la tua domanda per includere gli output richiesti e tutti i messaggi di errore che ricevi. +1 per aver effettivamente provato qualcosa e una buona formattazione della domanda. in bocca al lupo.
shellter

Perché questo codice è uguale alla soluzione proposta e accettata? È confuso ... Immagino che la domanda iniziale non avesse gli spazi subito dopo la parentesi di apertura e prima della parentesi di chiusura della frase if?
Stef

6
@Sef se guardi da vicino, $1="country"vs.$1 = "country"
Will il

Risposte:


413

Non dimenticare gli spazi:

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

121
Non posso credere di dedicare tre ore a questo, ed è stato solo un problema di spazi !!!! ... GRAZIE @Alex
Alejandro

1
Perché usi samples="US Canada Mexico..."dopo aver introdotto la creazione dell'array prima samples=(US Canada Mexico...)?
utente sconosciuto

10
Ho riscontrato problemi con questo quando la variabile a sinistra era una stringa vuota. La correzione era if [ "$1" = "country" ]; then.
Andrew

8
Va bene. Bash ottiene ufficialmente il mio voto per essere il linguaggio di comando più obsoleto ma ancora usato. La sintassi è così non intuitiva che fa male. Davvero nessun posto per questo nel 2016+. Autori di @Systemd: puoi per favore "costruire una shell Linux che non fa schifo" il tuo prossimo progetto? Ti lancio soldi.
masi,

3
@masi a volte penso che l'intento originale di unix fosse "sicurezza del lavoro attraverso l'oscurità". se gli strumenti fossero criptici da usare, difficili da capire e generalmente fuori dalla portata dei grandi non lavati senza la conoscenza interiore tramandata dal maestro a Padwan, si assicurerebbe che ci sarebbe sempre del lavoro per quelli "nel sapere". questa filosofia è evidente in tutto il costrutto "RFC" e il linguaggio fiorito usato nei documenti man, che mentre ti dice tecnicamente come usare gli strumenti, in realtà erano lì solo per soddisfare il requisito di aver documentato gli strumenti. poco è cambiato.
non sincronizzato il

184

Puoi usare gli operatori "=" o "==" per il confronto delle stringhe in bash. Il fattore importante è la spaziatura tra parentesi. Il metodo corretto è che le parentesi contengano la spaziatura all'interno e che gli operatori contengano la spaziatura intorno. In alcuni casi funzionano diverse combinazioni; tuttavia, ciò che segue è un esempio universale.

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

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

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

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

Inoltre, le doppie parentesi vengono gestite in modo leggermente diverso rispetto alle parentesi singole ...

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).

Spero che aiuti!


12

Sembra che tu stia cercando di analizzare gli argomenti della riga di comando nel tuo script bash. L'ho cercato di recente da solo. Mi sono imbattuto in quanto segue che penso ti aiuterà ad analizzare gli argomenti:

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

Ho aggiunto lo snippet di seguito come 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 server -p password -v

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.