Necesito leer un valor desde la terminal en un script bash. Me gustaría poder proporcionar un valor predeterminado que el usuario pueda cambiar.
# Please enter your name: Ricardo^
En este script, el mensaje es "Por favor ingrese su nombre:" el valor predeterminado es "Ricardo" y el cursor estará después del valor predeterminado. ¿Hay alguna manera de hacer esto en un script bash?
input
y luego usandoname=${input:-$name}
.name=${!input:-$name}
hacer?$1
se convierte en${1:-some_default_string}
fuente
-e
parece ser obligatorio permitir-i
que realmente funcioneEn Bash 4:
Esto muestra el nombre después del mensaje de esta manera:
con el cursor al final del nombre y permite al usuario editarlo. La última línea es opcional y obliga al nombre a ser el predeterminado original si el usuario borra la entrada o el predeterminado (enviando un valor nulo).
fuente
name
lugar deinput
en elread
comando.$name
se conserva si el usuario elimina el valor propuesto (y por lo tanto ingresa una cadena nula). Todo depende de cuál sea su necesidad. Lo dije en mi respuesta. Sin embargo, tiene razón, podría haber sido más explícito y decir que si no se usara la línea opcional, entonces la variable podría haber sidoname
.Código:
Ejecución de muestra:
fuente
Encontré esta pregunta, buscando una forma de presentar algo como:
Usando los ejemplos anteriores deduje esto: -
Espero que ayude a alguien a no tener que pensar la lógica, si encuentran el mismo problema
fuente
Acabo de usar este patrón, que prefiero:
fuente
Establecer el valor predeterminado; Imprímelo; leer un nuevo valor; Si hay un nuevo valor, úselo en lugar del predeterminado. Hay (o hubo) algunas variaciones entre shells y sistemas sobre cómo suprimir una nueva línea al final de un aviso. La notación '\ c' parece funcionar en MacOS X 10.6.3 con un bash 3.x, y funciona en la mayoría de las variantes de Unix derivadas del Sistema V, usando shells Bourne o Korn.
También tenga en cuenta que el usuario probablemente no se dará cuenta de lo que está sucediendo detrás de escena; sus nuevos datos se ingresarían después del nombre que ya está en la pantalla. Puede ser mejor formatearlo:
fuente
printf
es más portátil queecho
if (test -z "$xxx"); ...
' y de otros shellismos en C.\c
, ya que también es compatibleecho -n
! Sin embargo, debe agregar-e
para obtener el eco de bash para interpretar escapes. Creo que\c
es por las cosas que no se dijeron:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
$ bash --version
GNU bash, version 4.3.33(0)-release
a) "Me gustaría poder proporcionar un valor predeterminado que el usuario pueda cambiar". Tuecho "Please enter your name: $name \c"
no me permite editar el valor predeterminado. b) "y el cursor estaría después del valor predeterminado". No es cierto, tampoco ... La respuesta de @Paused hasta nuevo aviso. cumple ambos requisitos.fuente
Los parámetros -e y -t no funcionan juntos. Probé algunas expresiones y el resultado fue el siguiente fragmento de código:
fuente
;)
. Esto está permitido en SO! pero no queremos contaminar otras preguntas con cosas no relacionadas.