2012-06-12 26 views
6

estoy siguiendo el tutorial aquí: http://bash.cyberciti.biz/guide/If..else..fi#Number_Testing_Scriptscript de shell: if

Mi script se parece a:

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 

pero mi salida será similar a:

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

¿Por qué dice Tengo demasiados argumentos? No veo cómo mi guión es diferente del que está en el tutorial.

+0

¿Tiene la primera línea #!/Bin/bash en su secuencia de comandos? ¿También está ejecutando el script en bash shell o ksh? – Raghuram

Respuesta

10

wc -l file comando imprimirá dos palabras. Prueba esto:

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

depurar un script bash (boot.sh), se puede:

$ bash -x ./boot.sh 

Se va a imprimir cada línea ejecutada.

+0

Esto debería haber sido obvio, ¡gracias! – dukevin

+0

@KevinDuke debe agregar una línea 'líneas de eco contiene $ líneas' para que pueda ver lo que está pasando ... – mvds

+1

Una forma de ayudarlo en estos casos es mediante el uso de la opción -x: " sh -x ./ script_name " Esto imprime el script con los valores de variable sustituidos. –

8
wc -l file 

salidas

1234 file 

uso

lines=`wc -l < file` 

para obtener sólo el número de líneas. Además, algunas personas prefieren esta notación en lugar de acentos abiertos:

lines=$(wc -l < file) 

También, ya que no sabemos si $var contiene espacios, y si existe el archivo:

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

Esto producirá un resultado inesperado si el script tiene problemas de permisos o si se produce algún otro error. Probablemente sea mejor simplemente ejecutar 'wc' y abortar si falla, permitiendo que' wc' imprima un mensaje de error apropiado (que pertenece a stderr). Por ejemplo: 'a = $ (wc -l <" $ fn ") || salida 1; si prueba "$ a" -le 10; entonces ... ' –

1

También, se debe utilizar

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

test condition es muy anticuado, y así es que es el sucesor inmediato, [ condition ], sobre todo porque hay que tener mucho cuidado con los de Sra. Por ejemplo, debe citar cualquier $var que pase a test o [ ], y hay otros detalles que se ponen peludos. (las pruebas se tratan de todas las maneras como cualquier otro comando). Echa un vistazo a este article para más detalles.

+1

En Bash, para las comparaciones enteras, debe usar' if ((líneas <10)) '.La comparación que está mostrando es una comparación léxica que fallará para '$ lines' con un valor de' 2', por ejemplo. –

+0

'test' y' ['no están desactualizados, solo abusaron mucho. Pero son mucho más portátiles que '[[' y '(('. –