Je dois lire une valeur du terminal dans un script bash. J'aimerais pouvoir fournir une valeur par défaut que l'utilisateur peut modifier.
# Please enter your name: Ricardo^
Dans ce script, l'invite est "Veuillez entrer votre nom:" la valeur par défaut est "Ricardo" et le curseur se placerait après la valeur par défaut. Y at-il un moyen de faire cela dans un script bash?
vous pouvez utiliser expansion des paramètres eg
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
L'inclusion de la valeur par défaut dans l'invite entre crochets est une convention assez courante
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
Dans Bash 4:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
Cela affiche le nom après l'invite comme ceci:
Please enter your name: Ricardo
avec le curseur à la fin du nom et permet à l'utilisateur de le modifier. La dernière ligne est facultative et oblige le nom à être la valeur par défaut si l'utilisateur efface l'entrée ou la valeur par défaut (soumission d'une valeur null).
Code:
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"
Échantillon échantillon:
Please enter IN_PATH [/tmp/input.txt]:
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
J'ai trouvé cette question, cherchant un moyen de présenter quelque chose comme:
Something interesting happened. Proceed [Y/n/q]:
En utilisant les exemples ci-dessus, j'ai déduit ceci: -
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
Espoir qui aide quelqu'un à ne pas avoir à réfléchir à la logique s'il rencontre le même problème
Je viens d'utiliser ce modèle, que je préfère:
read name || name='(nobody)'
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
Définir la valeur par défaut; imprime le; lire une nouvelle valeur; s'il existe une nouvelle valeur, utilisez-la à la place de la valeur par défaut. Il y a (ou existait) des différences entre les shells et les systèmes sur la façon de supprimer une nouvelle ligne à la fin d'une invite. La notation '\ c' semble fonctionner sous MacOS X 10.6.3 avec une version 3.x, et sur la plupart des variantes d’Unix dérivées de System V, utilisant des shells Bourne ou Korn.
Notez également que l'utilisateur ne réalisera probablement pas ce qui se passe dans les coulisses; leurs nouvelles données seraient saisies après le nom déjà affiché à l'écran. Il serait peut-être préférable de le formater:
echo "Please enter your name ($name): \c"
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'