it-swarm.com.de

Lesen Sie eine Variable in der Bash mit einem Standardwert

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?

130
Ricardo Marimon

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

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

echo $NAME
128
Jadav Bheda

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

39

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

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

11
sibaz

Ich habe gerade dieses Muster verwendet, das mir lieber ist:

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