2013-06-17 17 views
12
#!/bin/bash 
function getComment(){ 
    local lang=$1; 
    local theComment=$2; 
    if [$lang == "Java"] #Surprisingly, an error occurs here: prog.sh: line 6: [Java: command not found 
    then 
     echo "//"$theComment; return; 
    else 
     echo "Language not found!"; return; 
    fi 
} 

getComment "Java" "Whoo!"; 

exit $? 

Sto scrivendo uno script Bash che confronta una variabile ad una stringa letterale, e sto usando [$lang == "Java"] (come mostrato sopra) per confrontare il valore di lang-"Java" . Tuttavia, questo confronto produce il seguente errore:confrontare una stringa Bash letterale una variabile locale

stderr: 
prog.sh: line 6: [Java: command not found 

Ho provato con [$lang -eq "Java"] e ($lang -eq "Java") pure, ma queste dichiarazioni non funzionavano, e hanno prodotto esattamente lo stesso errore.

Perché si verifica questo errore e qual è il modo corretto per confrontare una variabile locale con una stringa letterale?

+0

Questo non è rilevante per la domanda, ma non è necessario il punto e virgola alla fine delle righe nella shell. Sono necessari solo se si mettono più di un comando su una singola riga. –

+0

possibile duplicato di [bash, comando non trovato] (http://stackoverflow.com/questions/16694586/bash-command-not-found) – chepner

+1

Non è il duplicato migliore, ma ci sono molte domande su Stack Overflow con la stessa risposta : posiziona degli spazi attorno a '[' e ']' di un comando 'test'. – chepner

risposta

22

È necessario spazi attorno [ e ]:

if [ "$lang" = "Java" ] 

[ è un comando (è sinonimo di test), e come qualsiasi altro comando che delimitano i parametri con gli spazi.

Si dovrebbero anche inserire le variabili tra virgolette, nel caso in cui il valore sia vuoto o contenga caratteri bianchi o caratteri jolly.

Infine, l'operatore per eseguire il confronto delle stringhe è =, sebbene alcune versioni di test consentano come estensione ==.

+0

buona risposta con contesto –

1

La prima cosa è, non usare [] - è better per usare [[.

E in secondo luogo - è necessario aggiungere alcuni spazi:

if [[ $lang == Java ]] 
+0

L'operatore di confronto == si comporta diversamente all'interno di un test a parentesi quadre rispetto a parentesi singole. http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS –

2

In primo luogo, è necessario racchiudere la variabile tra virgolette, perché la variabile potrebbe avere alcuni spazi o caratteri speciali.

Infine ricorda che "[" è un eseguibile da solo (di solito è in/bin).

if [ "$lang" == "Java" ]; then 
Problemi correlati