2010-08-05 11 views
121

Il mio codice:[: Operatore imprevisto nella programmazione della shell

#!/bin/sh 
    #filename:choose.sh 
    read choose 
    [ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0 
    [ "$choose" == "n" -o "$choose" == "N" ] && echo "No" && exit 0 
    echo "Wrong Input" && exit 0 

Ma quando eseguo

sh ./choose.sh 

terminale, me che

[: 4: n: :Unexpected operator 
    [: 5: n: :Unexpected operator 

C'è qualche errore nel mio script bash ? Grazie!

+0

Quando eseguivo lo stesso codice in Linux e in cygwin non ricevevo errori – Raghuram

+2

Cygwin ha molto probabilmente aliasato 'sh' in' bash'. Alcune distribuzioni non offrono più un vero 'sh'. Sebbene alcuni sostengano (e io tendo ad essere d'accordo) che se stai scrivendo uno script per essere portabile, scrivilo in 'sh' invece di' bash'. – Wolph

+0

Il mio problema era che dovevo 'source foobar.sh' not'./Foobar.sh' – jsta

risposta

215

v'è alcun errore nella vostra bash script. Ma si sta eseguendo con sh che ha una meno estesa sintassi;)

Quindi, eseguire bash ./choose.sh invece :)

+2

Risolvi il mio problema. Grazie! Quindi c'è qualche differenza tra il comando "sh" e "bash"? –

+3

La sintassi 'bash' è un superset della sintassi' sh' - l'eseguibile '/ bin/sh' sul tuo sistema può fornire solo la funzionalità' sh' standard, in cui i test in stile '[]' non sono inclusi. – Tim

+10

Sì. Sono gusci completamente diversi. Anche se bash era basato ed è ampiamente compatibile con sh, e potrebbe essere lo stesso programma sul tuo sistema, ma si comporterebbe diversamente a seconda del nome che usi. Puoi eseguire lo script con bash automaticamente cambiando la prima riga in '#!/Bin/bash' e rendendo eseguibile il file, e semplicemente eseguendo'./Choose.sh'. –

5

Devi usare bash al posto o riscrivere lo script utilizzando sh standard di

sh -c 'test "$choose" = "y" -o "$choose" = "Y"' 
+0

Penso che sia più comodo usare "[]" invece di "test". Sembrava che "bash. /choose.sh" potesse risolvere il problema. –

+0

@kit in entrambi i casi, sh è più piccolo portatile – Anycorn

+3

@ kit.yang In che modo le parentesi sono più convenienti? La confusione storica causata dal fatto che le persone non si rendessero conto che [è un sinonimo di test e gli errori continui commessi attraverso spazi bianchi omessi intorno alle parentesi difficilmente compensano il singolo carattere salvato. ("if [$ x = 5]" vs "se test $ x = 5"; 13 caratteri vs 14). –

2

Per eseguire con Bash, l'uso #!/Bin/bash e chmod che sia! eseguibile, quindi utilizzare

./choose.sh 
192

POSIX sh non capisce == per l'uguaglianza di stringa, come quello è un bash -ismo. Utilizzare invece =.

Le altre persone che affermano che le parentesi non sono supportate da sh sono errate, btw.

+4

Sì, provo a sostituire solo "==" per "=", lo script può anche essere esecutivo da "sh ./choose.sh".Both bash e sh supportano le parentesi. –

+25

+1 Questa è una risposta migliore rispetto a usare inutilmente bash, IMO. –

+4

dare quest'uomo un biscotto! – tbking

1

Infatti il ​​"[" parentesi quadra aperta è solo un alias di shell interno per il comando test.

modo da poter dire:

test -f "/bin/bash" && echo "This system has a bash shell" 

o

[ -f "/bin/bash" ] && echo "This system has a bash shell" 

... sono equivalenti sia in sh o bash. Nota il requisito di avere una parentesi chiusa "]" sul comando "[" ma diverso da quello "[" è uguale a "test". "test uomo" è una buona cosa da leggere.

+0

'man test' è la pagina di manuale di/bin/test non per la funzione di shell incorporata – stew

+0

' ls $ (which [) ' dà '/ usr/bin/[' –

5

è possibile utilizzare caso/esac invece di if/else

case "$choose" in 
    [yY]) echo "Yes" && exit;; 
    [nN]) echo "No" && exit;; 
    *) echo "wrong input" && exit;; 
esac 
-2

Non utilizzare una qualsiasi parola chiave riservata come l'inizio di un nome di variabile: esempio HOSTNAME fallirà come ospite {TYPE | NAME} sono riservati

21

Nel codice sostituire questa linea:

#!/bin/sh 

con

#!/bin/bash 

Questa deve essere la prima riga dello script e indica quale shell di linux deve essere utilizzata. sh non supporta gli stessi comandi di bash.

+0

Questo dovrebbe essere contrassegnato come la risposta corretta. – MaxZoom