Лучший способ принять изменения 'Да' от приглашения оболочки

Если команда берет список файлов как аргументы и обрабатывает те файлы, как введено (или произведите, но не обычно), каждый из тех файлов может быть именованным каналом или/dev/fd псевдофайлом, обеспеченным прозрачно процессом subsitution:

$ sort -m <(command1) <(command2) <(command3)

Это "передаст вывод по каналу" трех команд к виду, поскольку вид может взять список входных файлов на командной строке.

27
22.05.2011, 18:42
5 ответов

Используя a case несколько эквивалентно, но не прекрасен начиная с операторов как YE приняты.

read -p 'Answer this question with yes: ' answer
case "${answer}" in
    [yY]|[yY][eE][sS])
        echo 'Surely this can be written better?' ;;
esac
15
27.01.2020, 19:39
  • 1
    я сказал бы, что намерение пользователя довольно ясно от 'Вас'. –  Aeyoun 22.05.2011, 21:29

Стандарт UNIX предоставляет пример кода для этого использования locale утилита:

if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
    affirmative processing goes here
else
    non-affirmative processing goes here
fi

Значение для 'yesexpr' в POSIX локаль (и на английских локалях в реальных системах) "^[yY]". Это должно быть интерпретировано как расширенное регулярное выражение. См. также noexpr.

48
27.01.2020, 19:39
  • 1
    . Но я, кажется, идиот. Где я могу найти список аргументов этим locale знает о? Страница справочника на моем поле Mac OS 10.5, кажется, не имеет их. –  dmckee --- ex-moderator kitten 22.05.2011, 23:48
  • 2
    Хороший. Вы могли связаться назад с источником? –  Aeyoun 23.05.2011, 00:51
  • 3
    @dmckee можно сделать locale -k LC_MESSAGES (и для другого LC_whatever), или посмотрите здесь для, определенных стандартом. @Daniel, что источник кроме страницы утилиты локали, которую я действительно связывал? –  Random832 23.05.2011, 01:20
  • 4
    Большой ответ, должен определенно быть принятый. –  jlliagre 16.09.2013, 14:52

Пребывание в ударе (или любая другая оболочка, если Вы отображаете подсказку независимо):

case $answer in
  [Yy]*) echo Ok;;
  *) echo "Can't you read? I said to say yes.";;
esac

Это принимает ответы как yn как да,  y (с начальным пространством) как не, и wlkjzuhfod как не, который не может быть оптимальным, но согласовывается с типичными приглашениями оболочки: это то, как rm -i, find -ok и другие делают это.

Это сторонится целой проблемы интернационализации: на других языках необходимо было бы перевести ожидаемые ответы. Затем нет никакого стандартного метода оболочки; можно обратиться к диалоговому окну, но затем сценарий потребует, чтобы это было установлено (это доступно во многих дистрибутивах, но не всегда устанавливаемое по умолчанию).

if dialog --yesno "Choose yes" 0 0; then …
6
27.01.2020, 19:39

Я обычно использую простую функцию:

Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }

Функция просто возвращается 0 если Y или y вводится и 1 если что-либо еще вводится. Это может использоваться с if...fi:

if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi

Или точно так же, как это:

Confirm "Type y" && echo "You typed y"
3
27.01.2020, 19:39
  • 1
    Взлетите -s иметь визуальную историю какой, что было введено. –  Tom Hale 11.09.2016, 13:47

Просто повторно измененный @faif ответ

YesOrNo() {
        while :
        do
                read -p 'Do you want to Continue (yes/no?): ' answer
                case "${answer}" in
                    [yY]|[yY][eE][sS]) exit 0 ;;
                        [nN]|[nN][oO]) exit 1 ;;
                esac
        done
}


if $( YesOrNo ); then
        echo "Ans is yes.. Do something....."
else
        echo "Ans is No... skip.."
fi

Тест

root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):  # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....
0
27.01.2020, 19:39

Теги

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