Estoy tratando de hacer un script de shell que debería usarse así:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txtEl 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>&1Pero no sé cómo obtener los valores -fromy -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
$1y$2y$3donde el número se refiere al argumento.$0es el comando en sí.Los argumentos están separados por espacios, por lo que si proporciona
-fromy-toen 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
-fromy 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
$1y$2no 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 :
getoptses 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:vdice que-vsolo se interpretará como una bandera.optses donde se almacena el parámetro actual. Lacasedeclaración es donde procesará esto.${OPTARG}contiene el valor que sigue al parámetro.${FROM_VAL}por ejemplo, obtendrá el valor/home/kristoffer/test.pngsi ejecutó su script como:ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txtComo 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
getoptsfunciona.fuente
f:t:vs, será-f some_f -t some_t -v -sUtilizar 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.shscript, 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
$1pasa el primer argumento al script, el$2segundo 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