Parámetros de script en Bash

Estoy tratando de hacer un script de shell que se debería usar así:

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt 

La secuencia de comandos luego convertirá el archivo de imagen a un archivo de texto. Esto es lo que he propuesto hasta ahora:

 #!/bin/bash export HOME=/home/kristoffer /usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1 

Pero no sé cómo obtener los valores -from y -to . ¿Alguna idea de cómo hacerlo?

Los argumentos que proporcione a un bashscript aparecerán en las variables $1 y $2 y $3 donde el número se refiere al argumento. $0 es el comando en sí.

Los argumentos están separados por espacios, por lo que si proporcionas -from y -to en el comando, también terminarán en estas variables, así que para esto:

 ./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt 

Obtendrás:

 $0 # ocrscript.sh $1 # -from $2 # /home/kristoffer/test.png $3 # -to $4 # /home/kristoffer/test.txt 

Puede ser más fácil omitir el -from y el -to , como:

 ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt 

Entonces tendrás:

 $1 # /home/kristoffer/test.png $2 # /home/kristoffer/test.txt 

La desventaja es que tendrá que proporcionarlo en el orden correcto. Hay bibliotecas que pueden facilitar el análisis de los argumentos con nombre en la línea de comandos, pero generalmente para los scripts de shell simples, debe usar la forma sencilla, si no es un problema.

Entonces puedes hacer:

 /usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1 

Las comillas dobles alrededor de $1 y $2 no siempre son necesarias, pero se asesoran, porque algunas cadenas no funcionarán si no las coloca entre comillas dobles.

Si no está completamente apegado a usar “de” y “a” como sus nombres de opción, es bastante fácil implementar esto usando getopts :

 while getopts f:t: opts; do case ${opts} in f) FROM_VAL=${OPTARG} ;; t) TO_VAL=${OPTARG} ;; esac done 

getopts es un progtwig que procesa argumentos de línea de comando y los analiza convenientemente por usted.

f:t: especifica que espera 2 parámetros que contienen valores (indicados por dos puntos). Algo como f:t:v dice que -v solo se interpretará como una bandera.

opts es donde se almacena el parámetro actual. La statement del case es donde procesará esto.

${OPTARG} contiene el valor que sigue al parámetro. ${FROM_VAL} por ejemplo, obtendrá el valor /home/kristoffer/test.png si ejecutó su script como:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Como sugieren los otros, si esta es la primera vez que escribe scripts bash, debería leer algunos conceptos básicos. Este fue solo un tutorial rápido sobre cómo funciona getopts .

Use las variables "$1" , "$2" , "$3" etc. para acceder a los argumentos. Para acceder a todos ellos puede usar "$@" , o para obtener el recuento de argumentos $# (podría ser útil verificar si hay demasiados o demasiados argumentos).

Necesitaba asegurarme de que mis scripts fueran completamente portátiles entre varias máquinas, shells e incluso versiones de cygwin. Además, mis colegas, para quienes escribí las secuencias de comandos, son progtwigdores, así que terminé usando esto:

 for ((i=1;i<=$#;i++)); do if [ ${!i} = "-s" ] then ((i++)) var1=${!i}; elif [ ${!i} = "-log" ]; then ((i++)) logFile=${!i}; elif [ ${!i} = "-x" ]; then ((i++)) var2=${!i}; elif [ ${!i} = "-p" ]; then ((i++)) var3=${!i}; elif [ ${!i} = "-b" ]; then ((i++)) var4=${!i}; elif [ ${!i} = "-l" ]; then ((i++)) var5=${!i}; elif [ ${!i} = "-a" ]; then ((i++)) var6=${!i}; fi done; 

Justificación: incluí también un script launcher.sh , ya que toda la operación tenía varios pasos que eran casi independientes el uno del otro (digo "cuasi", porque aunque cada script se podía ejecutar solo, por lo general eran todos corrieron juntos), y en dos días me enteré de que casi la mitad de mis colegas, siendo progtwigdores y todos, eran demasiado buenos para usar el archivo iniciador, seguían el "uso" o leían el AYUDA que se mostraba cada vez Hicieron algo mal y estaban arruinando todo, ejecutando guiones con argumentos en el orden incorrecto y quejándose de que los guiones no funcionaban correctamente. Siendo el colérico que soy, decidí revisar todos mis guiones para asegurarme de que sean a prueba de colegas. El segmento de código anterior fue lo primero.

En bash $1 es el primer argumento pasado al script, $2 segundo y así sucesivamente

 /usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1 

Entonces puedes usar:

 ./your_script.sh some_source_file.png destination_file.txt 

Explicación sobre comillas dobles;

considerar tres scripts:

 # foo.sh bash bar.sh $1 # cat foo2.sh bash bar.sh "$1" # bar.sh echo "1-$1" "2-$2" 

Ahora invocar:

 $ bash foo.sh "ab" 1-a 2-b $ bash foo2.sh "ab" 1-ab 2- 

Cuando foo.sh "ab" , invoca bar.sh ab (dos argumentos) y con foo2.sh "ab" invoca bar.sh "ab" (1 argumento). Siempre tenga en cuenta cómo se pasan los parámetros y se expanden en bash, le ahorrará muchos dolores de cabeza.