Ich muss einen Wert vom Terminal in einem Bash-Skript lesen. Ich möchte gerne einen Standardwert angeben, den der Benutzer ändern kann.
# Please enter your name: Ricardo^
In diesem Skript lautet die Aufforderung "Bitte geben Sie Ihren Namen ein". Der Standardwert ist "Ricardo" und der Cursor würde hinter dem Standardwert stehen. Gibt es eine Möglichkeit, dies in einem Bash-Skript zu tun?
sie können Parametererweiterung verwenden
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
Das Einschließen des Standardwerts in die Aufforderung zwischen Klammern ist eine ziemlich übliche Konvention
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
In Bash 4:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
Daraufhin wird der Name nach der Aufforderung folgendermaßen angezeigt:
Please enter your name: Ricardo
mit dem Cursor am Ende des Namens und erlaubt dem Benutzer, ihn zu bearbeiten. Die letzte Zeile ist optional und erzwingt, dass der Name der ursprüngliche Standardwert ist, wenn der Benutzer die Eingabe löscht, oder den Standardwert (das Senden einer 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"
Probelauf:
Please enter IN_PATH [/tmp/input.txt]:
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
Ich fand diese Frage und suchte nach einer Möglichkeit, etwas zu präsentieren:
Something interesting happened. Proceed [Y/n/q]:
Anhand der obigen Beispiele folgerte ich Folgendes:
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
Hoffe, das hilft jemandem, die Logik nicht durchdenken zu müssen, wenn sie auf dasselbe Problem stoßen
Ich habe gerade dieses Muster verwendet, das mir lieber ist:
read name || name='(nobody)'
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
Legen Sie den Standard fest. Druck es; einen neuen Wert lesen; Wenn es einen neuen Wert gibt, verwenden Sie ihn anstelle des Standardwerts. Es gibt (oder gab) einige Unterschiede zwischen Shells und Systemen, wie eine Zeilenumbrüche am Ende einer Eingabeaufforderung unterdrückt werden können. Die\c-Notation scheint auf MacOS X 10.6.3 mit einer 3.x-Bash zu funktionieren und funktioniert bei den meisten von System V abgeleiteten Unix-Varianten, die Bourne- oder Korn-Shells verwenden.
Beachten Sie auch, dass der Benutzer wahrscheinlich nicht erkennt, was sich hinter den Kulissen abspielt. Ihre neuen Daten werden nach dem bereits auf dem Bildschirm angezeigten Namen eingegeben. Es könnte besser sein, es zu formatieren:
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" }'