Es ist möglich, eine lokalisierte "Ja / Nein Auswahl" in einer POSIX-Shell zu behandeln; indem man die Einträge der LC_MESSAGES
Lokalisierungskategorie verwendet, die vorgefertigte RegEx-Muster zum Abgleichen eines Eingangs und lokalisierte Ja-Nein-Strings bereitstellt.
#!/usr/bin/env sh
# LC_MESSAGES-Werte in Variablen übernehmen
# shellcheck disable=SC2046 # Beabsichtigtes IFS-Splitting
IFS='
' set -- $(locale LC_MESSAGES)
yesexpr="$1"
noexpr="$2"
yesstr="$3"
nostr="$4"
messages_codeset="$5" # hier nicht verwendet, aber als Dokumentation beibehalten
# Ja / Nein ?-Prompt in der Lokalisierung anzeigen
echo "$yesstr / $nostr ?"
# Antwort einlesen
read -r yn
# Antwort überprüfen
case "$yn" in
# Abgleich funktioniert nur mit dem Zeichenklassenanteil des Ausdrucks
${yesexpr##^}) echo "Antwort $yesstr" ;;
${noexpr##^}) echo "Antwort $nostr" ;;
esac
BEARBEITEN: Wie @Urhixidur in seinem Kommentar erwähnt hat:
Leider spezifiziert POSIX nur die ersten beiden (yesexpr und noexpr). Auf Ubuntu 16 sind yesstr und nostr leer.
Siehe: https://www.ee.ryerson.ca/~courses/ele709/susv4/xrat/V4_xbd_chap07.html#tag_21_07_03_06
LC_MESSAGES
Die Lokalisierungsstichwörter yesstr
und nostr
sowie die Langinfo-Elemente YESSTR
und NOSTR
wurden früher verwendet, um Benutzerantworten auf Ja und Nein abzugleichen. In POSIX.1-2008 wurden die erweiterten regulären Ausdrücke yesexpr
, noexpr
, YESEXPR
und NOEXPR
eingeführt, die sie ersetzten. Anwendungen sollten die allgemeinen Lokalisierungs-Messaging-Einrichtungen verwenden, um Aufforderungsnachrichten mit Beispielerwartungen auszugeben.
Alternativ können Sie die Bash-Methoden mit Lokalisierungen verwenden:
#!/usr/bin/env bash
IFS=$'\n' read -r -d '' yesexpr noexpr _ < <(locale LC_MESSAGES)
printf -v yes_or_no_regex "(%s)|(%s)" "$yesexpr" "$noexpr"
printf -v prompt $"Bitte beantworten Sie mit Ja (%s) oder Nein (%s): " "$yesexpr" "$noexpr"
declare -- answer=;
until [[ "$answer" =~ $yes_or_no_regex ]]; do
read -rp "$prompt" answer
done
if [[ -n "${BASH_REMATCH[1]}" ]]; then
echo $"Sie haben mit Ja geantwortet."
else
echo $"Nein, war Ihre Antwort."
fi
Die Antwort wird mit den bereitgestellten regulären Ausdrücken der Lokalisierungsumgebung abgeglichen.
Um die verbleibenden Nachrichten zu übersetzen, verwenden Sie bash --dump-po-strings scriptname
, um die PO-Strings für die Lokalisierung auszugeben:
#: scriptname:8
msgid "Bitte beantworten Sie mit Ja (%s) oder Nein (%s): "
msgstr ""
#: scriptname:17
msgid "Sie haben mit Ja geantwortet."
msgstr ""
#: scriptname:19
msgid "Nein, war Ihre Antwort."
msgstr ""
40 Stimmen
Just als Hinweis: Die Konvention für Aufforderungen besagt, dass wenn Sie eine Option
[yn]
präsentieren, die Großschreibung die Standardeinstellung ist, d.h.[Yn]
wird standardmäßig auf "yes" und[yN]
auf "no" festgelegt. Siehe ux.stackexchange.com/a/40445/435324 Stimmen
Jeder, der von ZSH hierher kommt, siehe diese Antwort für die Verwendung des
read
Befehls zur Aufforderung2 Stimmen
Sie können auch meine zugehörige Frage/Antwort auf U&L.SE zur kanonischen Art, in
bash
zu pausieren, in Betracht ziehen. Die bereitgestellten Ergebnisse können einfach übertragen werden.