Zsh: test newline in case

Команда locale не печатает переменные окружения. Она печатает состояние локали пользователя, установленной окружением или умозаключением.

Например, если LC_TIME не установлен, его значение берется из LANG. А если установлено LC_ALL, то все остальные настройки отменяются.

Попробуйте:

$ LANG=ja_JP.utf8 locale
LANG=ja_JP.utf8
LANGUAGE=en_GB:en
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

$ LANG=ja_JP.utf8 LC_CTYPE=en_GB.UTF-8 locale
LANG=ja_JP.utf8
LANGUAGE=en_GB:en
LC_CTYPE=en_GB.UTF-8
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

$ LANG=ja_JP.utf8 LC_CTYPE=en_GB.UTF-8 LC_ALL=POSIX locale
LANG=ja_JP.utf8
LANGUAGE=en_GB:en
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=POSIX

Вы заметите, что вычисляемые значения показаны в двойных кавычках, а те, которые явно заданы переменными окружения, - без кавычек.

0
13.09.2018, 15:16
1 ответ

Вы не говорите, как вы получаете пользовательский ввод.

Сread:

read -k 'answer?Are you OK? '
case $answer in
  (y | Y | $'\n') echo 1;;
  # or ([$'yY\n']) echo 1;;
  (*)         echo 2;;
esac

Но если вы используете readбез -kили varedи хотите определить, когда пользователь нажимает Enter без ввода какого-либо ответа, тогда вы захотите проверить наличие пустого значение:

answer=; vared -p 'Are you OK? ' answer
case $answer in
  (y | Y | "") echo 1;;
  # or ([yY] | "") echo 1;;
  (*)         echo 2;;
esac

Или задайте ответ с помощью y(, хотя пользователю придется выполнить BackspaceN , чтобы сказать нет):

answer=y; vared -p 'Are you OK? ' answer
case $answer in
  (y | Y) echo 1;;
  (*)     echo 2;;
esac
1
28.01.2020, 02:42

Теги

Похожие вопросы