Leer una variable en bash con un valor predeterminado
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?
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 :-Richard
pieza? 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/httpdocs
not ~/httpdocs
, etc.
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
bash
usando homebrew - brew.sh -e
y-i
trabajar juntos:-e
usareadline
,-i
inserta texto usandoreadline
- Página de manual de bash 4+ para
read
- linuxcommand.org
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).
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
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.