2011-08-05 27 views
11

que estoy tratando de conseguir un script bash que genera jsdoc para los parámetros dados como esteshell de Linux añadir parámetros variables a Command

./jsdoc.sh file.js another.js maybe-a-third.js 

me estoy atascado en la forma de pasar una cantidad desconocida de parámetros para la próxima cáscara mando.

(también, no sé cómo comprobar si existe parámetro, sólo si no exitst if [ -z ... ])

Este código funciona durante un máximo de dos parámetros, pero obviamente no es la manera correcta de hacerlo ...

#!/bin/bash 

# would like to know how to do positive check 
if [ -z "$1" ] 
then echo no param 
else 
     d=$PWD 
     cd ~/projects/jsdoc-toolkit/ 

     # this bit is obviously not the right approach 
     if [ -z "$2" ] 
     then java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1 
     else java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1 $d/$2 
     fi 

     cp -R out/jsdoc $d 
fi 

Cualquier otro indicador de cómo podría lograr esto sería apreciado.

Editar: Actualización de acuerdo con la secuencia de comandos de @ skjaidev respuesta - día feliz;)

#!/bin/bash 

d=$PWD 

for i in $*; do 
    params=" $params $d/$i" 
done 

if [ -n "$1" ]; then 
     cd ~/projects/jsdoc-toolkit/ 
     java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $params 
     cp -R out/jsdoc $d 
fi 
+1

Use '" $ @ "' en lugar de '$ * 'para mayor seguridad. También usaría 'if (($ #> 0))' - "$ #" es la cantidad de argumentos. –

Respuesta

11

$ * tiene todos los parámetros. Se podría iterar sobre ellos

for i in $*; 
do 
    params=" $params $d/$i" 
done 
your_cmd $params 
+12

En este caso, siempre use '" $ @ "' en lugar de '$ *' - el primero conservará los argumentos que contengan espacios en blanco, el último estará sujeto a la división de palabras del shell. –

+0

+1 a ese Glenn. – jman

+1

Aunque '" $ @ "' conservará espacios en su expansión, la posterior expansión de '$ i' deshará el efecto y cuando' $ params' se expanda en la última línea, los nombres de archivo con espacios en blanco incrustados seguirán generando múltiples argumentos donde uno se esperaba Una solución específica para Bash es usar arreglos como los propuestos por @glennjackman –

3

-n es la inversa de -z y "[email protected]" es la forma canónica de pasar todos los parámetros en los que un subcomando. Esto y más se pueden encontrar a través del man bash.

+0

Eso es genial, casi resuelto. Lo último es ¿cómo anexar '$ d /' a cada parámetro, para imitar '$ d/$ 1 $ d/$ 2' pero con' $ @ '? –

12

Para manejar argumentos que contengan espacios en blanco, use "[email protected]" para iterar y guárdelos para usarlos más adelante en una matriz.

#!/bin/bash 
if (($# == 0)); then 
    echo "usage: $0 file ..." 
    exit 
fi 
dir=$(pwd) 
declare -a params 
for file in "[email protected]"; do params+=("$dir/$file"); done 
cd ~/projects/jsdoc-toolkit/ 
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${params[@]}" 
cp -R out/jsdoc "$dir" 
0

características-Bash específica (arrays en este caso) pueden evitarse mediante el uso cuidadoso de la variable IFS y la [email protected] parámetro especial.

#!/bin/sh 

dir=$(pwd) 

NEW_ARGV="" 
# carefully modify original arguments individually and separate them with newlines 
# in a new variable (in case they contain spaces) 
NEW_ARGV="" 
for var in "${@}" 
do 
    NEW_ARGV="${NEW_ARGV} 
${dir}/${var}" 
done 

SV_IFS=${IFS} 
# temporarily set IFS to a newline as per NEW_ARGV setup 
IFS=" 
" 
# reset [email protected] with the modified newline-separated arguments 
set -- ${NEW_ARGV} 
IFS=${SV_IFS} 

# for testing, demonstrate each param is preserved 
c=0 
for i in "${@}" 
do 
    c=`expr ${c} + 1` 
    echo "args-via-var #${c}: \"${i}\"" 
done 

cd ~/projects/jsdoc-toolkit/ 
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${@}" 
cp -R out/jsdoc "${dir}" 

No es necesario restablecer [email protected], pero al hacerlo se evita ensuciar con IFS en múltiples lugares. Sin pasar por [email protected], se debe configurar IFS en todas partes donde se expande $NEW_ARGV.

Aquellos con un buen ojo para los detalles observarán que este método no conserva los parámetros cuando contienen líneas nuevas. Sería posible usar cualquier carácter de control en lugar de nueva línea, excepto por supuesto NUL, y tal vez ASCII FS (separador de archivos, también conocido como ctrl-\) sería significativo y muy poco probable que ocurra en un nombre de archivo válido.