4 votos

¿Cómo pasar las respuestas al script CLI mediante argumentos?

Estoy escribiendo una secuencia de comandos de la CLI que hace una serie de preguntas antes de hacer un par de cosas. ¿Cómo puedo pasar como argumentos para no tener que introducir cada vez que quiero poner a prueba mi script?

Básicamente, se debe pasar de 4 elementos para STDIN, como "texto1[ENTER]text2[ENTER]texto3[ENTER]texto4[ENTER]" automáticamente.

Sí, yo podría modificar mi script de hecho, leer el shell de argumentos, pero no quiero hacerlo de esa manera, ya que se supone que debe funcionar más como un asistente.

Buscando algo como

SOMEPROGRAM myscript arg1 arg2 arg3 arg4

o

SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript

O algo como eso. Hay un programa de este tipo?

6voto

enzotib Puntos 38044

Entiendo que usted no desea modificar myscript.

En cuanto a la segunda solución que usted pide, usted puede usar printf:

printf '%s\n' text1 text2 text3 text4 | myscript

así que, la definición de un alias para SOMEPROGRAM como:

alias SOMEPROGRAM="printf '%s\n'" 

que efectivamente podría llamar

SOMEPROGRAM text1 text2 text3 text4 | myscript

La primera forma es ambiguo (desde el punto de vista de SOMEPROGRAM), porque no sé donde myscript opciones de final y parámetros de texto de inicio, a menos myscript es efectivamente invoca sin opciones. En este caso, usted podría utilizar una función:

SOMEPROGRAM() {
  myscript="$1"
  shift
  printf '%s\n' "$@" | "$myscript"
}

así que efectivamente podría llamar

SOMEPROGRAM myscript text1 text2 text3 text4

2voto

tidbeck Puntos 281

Así que, básicamente, usted desea pasar cada argumento como una línea de un programa infantil. A continuación es una secuencia de comandos que recorre todos los argumentos que se pasan de ti SOMEPROGRAM y los imprime como una línea. Usted puede pasar una línea vacía ("enter sin escribir algo antes de") por el paso de un argumento vacío como en SOMEPROGRAM yes '' | myscript.

#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to  a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
    echo "$arg"
done

Si usted siempre debe contestar "sí" a la secuencia de comandos, utilice el coreutil yes:

yes | myscript

Si necesita pasar algún otro valor, decir "no":

yes 'no' | myscript

1voto

mawaldne Puntos 1122

Puede pasar los parámetros, pero no funcionará, también tendrá que modificar el script bash para aceptar los parámetros de la línea de comandos también.

1voto

Anon Puntos 66

Si está escribiendo una secuencia de comandos, sólo tiene que utilizar getopts para que los argumentos se pasan a los scripts y, a continuación, puede utilizar los args como desee? ¿Es esto algo que usted está buscando?

Http://wiki.bash-hackers.org/howto/getopts_tutorial

1voto

Hackja4fun Puntos 21

Para los casos simples, la forma en que enzotib describe con tuberías de entrada desde un archivo parece razonable. Considere este script:

#!/bin/bash
read -p "What's your name?" name 
echo $name 
read -p "Age?" age 
echo $age
echo "Your name is " $name " and your age is "$age

invoca con:

echo -e "Foobar\n14\n" | ./namenage.sh 

El-e es permitir que las secuencias de escape como \newline.

Foobar
14
Your name is  Foobar  and your age is 14

Nota cómo por arte de magia, bash no imprimir el símbolo del sistema para la lectura.

Sin embargo, para los casos más complicados, hay un programa, llamado expect a manejar interactivo de la CLI de programas, donde usted tiene que esperar para el siguiente símbolo del sistema, antes de entrar en el segundo valor, y supongo que incluso puede rama en condiciones.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: