Leer una variable en bash con un valor predeterminado

Resuelto Ricardo Marimon asked hace 14 años • 9 respuestas

Necesito leer un valor de 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 "Ingrese su nombre:" el valor predeterminado es "Ricardo" y el cursor estaría después del valor predeterminado. ¿Hay alguna manera de hacer esto en un script bash?

Ricardo Marimon avatar Apr 15 '10 10:04 Ricardo Marimon
Aceptado

Puede utilizar la expansión de parámetros , por ejemplo

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

Incluir el valor predeterminado en el mensaje entre corchetes es una convención bastante común

¿ Qué hace la :-Richardpieza? Del manual de bash:

${parameter:-word} Si el parámetro no está establecido o es nulo, se sustituye la expansión de la palabra. De lo contrario, se sustituye el valor del parámetro.

También vale la pena señalar que...

En cada uno de los casos siguientes, la palabra está sujeta a expansión de tilde, expansión de parámetros, sustitución de comandos y expansión aritmética.

Entonces, si lo usa, webpath=${webpath:-~/httpdocs}obtendrá un resultado de /home/user/expanded/path/httpdocsnot ~/httpdocs, etc.

ghostdog74 avatar Apr 15 '2010 03:04 ghostdog74
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

Notas:

  • Esta opción requiere bash 4 o superior ( bash --version)
  • En macos, instale la versión actual bashusando homebrew - brew.sh
  • -ey -itrabajar juntos: -eusa readline, -iinserta texto usandoreadline
  • Página de manual de bash 4+ pararead - linuxcommand.org
Jadav Bheda avatar Jul 15 '2011 07:07 Jadav Bheda

En fiesta 4:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

Esto muestra el nombre después del mensaje como este:

Please enter your name: Ricardo

con el cursor al final del nombre y permite al usuario editarlo. La última línea es opcional y obliga a que el nombre sea el predeterminado original si el usuario borra la entrada o el valor predeterminado (enviando un valor nulo).

Dennis Williamson avatar Apr 15 '2010 04:04 Dennis Williamson

Código:

IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"

OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"

echo "Input: $IN_PATH Output: $OUT_PATH"

Ejecución de muestra:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
Manish Singh avatar May 12 '2013 13:05 Manish Singh

Encontré esta pregunta, buscando una manera de presentar algo como:

Something interesting happened.  Proceed [Y/n/q]:

Usando los ejemplos anteriores, deduje esto: -

echo -n "Something interesting happened.  "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
  echo "Quitting"
  exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
  echo "Not Proceeding"
else
  echo "Proceeding"
  # do proceeding code in here
fi

Espero que ayude a alguien a no tener que pensar en la lógica si se encuentra con el mismo problema.

sibaz avatar Aug 11 '2015 09:08 sibaz