2012-06-12 10 views
6

sto seguendo il tutorial qui: http://bash.cyberciti.biz/guide/If..else..fi#Number_Testing_Scriptscript di shell: if

Il mio script assomiglia:

lines=`wc -l $var/customize/script.php` 
if test $lines -le 10 
then 
    echo "script has less than 10 lines" 
else 
    echo "script has more than 10 lines" 
fi 

ma la mia uscita assomiglia:

./boot.sh: line 33: test: too many arguments 
script has more than 10 lines 

Perché si dice Ho troppi argomenti? Non riesco a vedere come il mio script è diverso da quello del tutorial.

+0

Hai la prima riga #!/Bin/bash nel tuo script? Inoltre stai eseguendo lo script in bash shell o ksh? – Raghuram

risposta

10

wc -l file comando stampa due parole. Prova questo:

lines=`wc -l file | awk '{print $1}'` 

Per eseguire il debug uno script bash (boot.sh), è possibile:

$ bash -x ./boot.sh 

Sarà stampare ogni riga eseguita.

+0

Questo dovrebbe essere ovvio, grazie! – dukevin

+0

@KevinDuke dovresti aggiungere una riga 'echo lines contiene $ lines' così puoi vedere cosa sta succedendo ... – mvds

+1

Un modo per aiutarti in questi casi è usando l'opzione -x: " sh -x ./ nome_script " Stampa lo script con i valori delle variabili sostituiti. –

8
wc -l file 

uscite

1234 file 

uso

lines=`wc -l < file` 

per ottenere solo il numero di righe. Inoltre, alcune persone preferiscono questa notazione, invece di backticks:

lines=$(wc -l < file) 

Inoltre, dal momento che non sappiamo se $var contiene spazi, e se il file esiste:

fn="$var/customize/script.php" 
if test ! -f "$fn" 
then 
    echo file not found: $fn 
elif test $(wc -l < "$fn") -le 10 
then 
    echo less than 11 lines 
else 
    echo more than 10 lines 
fi 
+0

Questo produrrà un output imprevisto se lo script presenta problemi di autorizzazione o si verifica qualche altro errore. Probabilmente è meglio eseguire semplicemente 'wc' e interrompere se fallisce, consentendo a' wc' di stampare un messaggio di errore appropriato (che appartiene a stderr). Ad esempio: 'a = $ (wc -l <" $ fn ") || uscita 1; se test "$ a" -le 10; poi ... ' –

1

Inoltre, si dovrebbe usare

if [[ $lines -gt 10 ]]; then 
    something 
else 
    something 
fi 

test condition è davvero superata, e così è il suo immediato successore, [ condition ], soprattutto perché bisogna stare molto attenti con quelli Signorina. Ad esempio, è necessario citare qualsiasi $var si passa a test o [ ], e ci sono altri dettagli che diventano pelosi. (i test sono trattati in ogni modo come qualsiasi altro comando). Dai un'occhiata a questo article per alcuni dettagli.

+1

In Bash, per i confronti tra interi, dovresti usare' if ((righe <10)) '.Il confronto che stai mostrando è un confronto lessicale che fallirà per '$ lines' con un valore di' 2', per esempio. –

+0

'test' e' ['non sono obsoleti, solo altamente abusati. Ma sono molto più portatili di "[[' e '(('. –