web-dev-qa-db-fra.com

Lire une variable dans bash avec une valeur par défaut

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?

130
Ricardo Marimon

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

178
ghostdog74
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME
128
Jadav Bheda

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).

39
Dennis Williamson

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
12
manish_s

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

11
sibaz

Je viens d'utiliser ce modèle, que je préfère:

read name || name='(nobody)'
8
bukzor
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"
5
Jonathan Leffler
#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" }'
0
kokane