Estoy tratando de hacer un script de shell que debería usarse así:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
El script luego convertirá el archivo de imagen en un archivo de texto. Esto es lo que se me ocurrió 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?
linux
bash
shell
parameters
Kristoffer
fuente
fuente
Respuestas:
Los argumentos que se suministre 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 proporciona
-from
y-to
en el comando, también terminarán en estas variables, por lo que para esto:Obtendrás:
Podría ser más fácil omitir el
-from
y el-to
, como:Entonces tendrás:
La desventaja es que tendrás que suministrarlo 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 scripts de shell simples, debe usar la forma fácil, si no hay problema.
Entonces puedes hacer:
Las comillas dobles alrededor de
$1
y$2
no siempre son necesarias, pero se recomiendan, porque algunas cadenas no funcionarán si no las pone entre comillas dobles.fuente
Si no está completamente apegado a usar "from" y "to" como nombres de opciones, es bastante fácil implementar esto usando getopts :
getopts
es un programa que procesa argumentos de línea de comando y los analiza convenientemente por usted.f:t:
especifica que está esperando 2 parámetros que contienen valores (indicados por dos puntos). Algo comof:t:v
dice que-v
solo se interpretará como una bandera.opts
es donde se almacena el parámetro actual. Lacase
declaración 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 demás, si es la primera vez que escribe scripts de bash, debería leer algunos conceptos básicos. Este fue solo un tutorial rápido sobre cómo
getopts
funciona.fuente
f:t:vs
, será-f some_f -t some_t -v -s
Utilizar las variables
"$1"
,"$2"
,"$3"
y así sucesivamente a los argumentos de acceso. Para acceder a todos ellos puede utilizar"$@"
, o para obtener el recuento de argumentos$#
(puede ser útil para comprobar si hay demasiados argumentos o muy pocos).fuente
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 tuve que escribir los scripts, son programadores, así que terminé usando esto:
Justificación: también incluí un
launcher.sh
script, ya que toda la operación tenía varios pasos que eran casi independientes entre sí (digo "cuasi", porque aunque cada script se podía ejecutar por sí solo, por lo general se ejecutaban todos juntos ), y en dos días descubrí que aproximadamente la mitad de mis colegas, que eran programadores y todo, eran demasiado buenos para usar el archivo de inicio, seguir el "uso" o leer la AYUDA que se mostraba cada vez que hacían algo. mal y estaban haciendo un lío con todo, ejecutando scripts con argumentos en el orden incorrecto y quejándose de que los scripts 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.fuente
En bash se
$1
pasa el primer argumento al script, el$2
segundo y así sucesivamenteEntonces puedes usar:
Explicación sobre comillas dobles;
considere tres guiones:
Ahora invoca:
Cuando invoca
foo.sh "a b"
, invocabar.sh a b
(dos argumentos) y confoo2.sh "a b"
él invocabar.sh "a b"
(1 argumento). Siempre tenga en cuenta cómo se pasan y expanden los parámetros en bash, esto le ahorrará muchos dolores de cabeza.fuente