В Bash, как добавить «Вы уверены [Y / n]» в любую команду или псевдоним? - PullRequest
201 голосов
/ 12 июля 2010

В данном конкретном случае я бы хотел добавить подтверждение в Bash для

Are you sure? [Y/n]

для Mercurial hg push ssh://username@www.example.com//somepath/morepath, который на самом деле является псевдонимом. Есть ли стандартная команда, которую можно добавить к псевдониму для ее достижения?

Причина в том, что hg push и hg out могут звучать одинаково, и иногда, когда я хочу hgoutrepo, я могу случайно ввести hgpushrepo (оба являются псевдонимами).

Обновление: , если это может быть что-то вроде встроенной команды с другой командой, такой как: confirm && hg push ssh://..., что было бы здорово ... просто команда, которая может запросить yes или no и продолжить с остальными, если yes.

Ответы [ 16 ]

1 голос
/ 11 января 2014

Попробуйте,

 #!/bin/bash
 pause ()
 {
 REPLY=Y
 while [ "$REPLY" == "Y" ] || [ "$REPLY" != "y" ]
 do
  echo -e "\t\tPress 'y' to continue\t\t\tPress 'n' to quit"
  read -n1 -s
      case "$REPLY" in
      "n")  exit                      ;;
      "N")  echo "case sensitive!!"   ;; 
      "y")  clear                     ;;
      "Y")  echo "case sensitive!!"   ;;
      * )  echo "$REPLY is Invalid Option"     ;;
 esac
 done
 }
 pause
 echo "Hi"
1 голос
/ 02 февраля 2013

Поздно к игре, но я создал еще один вариант confirm функций предыдущих ответов:

confirm ()
{
    read -r -p "$(echo $@) ? [y/N] " YESNO

    if [ "$YESNO" != "y" ]; then
        echo >&2 "Aborting"
        exit 1
    fi

    CMD="$1"
    shift

    while [ -n "$1" ]; do
        echo -en "$1\0"
        shift
    done | xargs -0 "$CMD" || exit $?
}

Чтобы использовать его:

confirm your_command

Особенности:

  • печатает вашу команду как часть приглашения
  • передает аргументы с помощью разделителя NULL
  • сохраняет состояние выхода вашей команды

Ошибки:

  • echo -en работает с bash, но может не работать в вашей оболочке
  • может завершиться ошибкой, если аргументы мешают echo или xargs
  • за миллиондругие ошибки, потому что сценарии оболочки трудны
0 голосов
/ 09 ноября 2017

Вот мое решение, которое использует локализованное регулярное выражение. Таким образом, на немецком языке «j» для «Ja» будет интерпретироваться как «да».

Первый аргумент - это вопрос, если вторым аргументом является "y", то да будет ответом по умолчанию, иначе нет будет ответом по умолчанию. Возвращаемое значение равно 0, если ответ «да», и 1, если ответ «нет».

function shure(){
    if [ $# -gt 1 ] && [[ "$2" =~ ^[yY]*$ ]] ; then
        arg="[Y/n]"
        reg=$(locale noexpr)
        default=(0 1)
    else
        arg="[y/N]"
        reg=$(locale yesexpr)
        default=(1 0)
    fi
    read -p "$1 ${arg}? : " answer
    [[ "$answer" =~ $reg ]] && return ${default[1]} || return ${default[0]}
}

Вот базовое использование

# basic example default is no
shure "question message" && echo "answer yes" || echo "answer no"
# print "question message [y/N]? : "

# basic example default set to yes
shure "question message" y && echo "answer yes" || echo "answer no"
# print "question message [Y/n]? : "
0 голосов
/ 30 сентября 2017

Ниже код объединяет две вещи

  1. shopt -s nocasematch, который позаботится о регистронезависимости

  2. и если условие, которое будет принимать оба входа, либо вы передадите да, да, да, у.

    shopt -s nocasematch

    if [[sed-4.2.2. $ LINE = ~ (yes | y) $]]

    затем выход 0

    ц

0 голосов
/ 02 декабря 2015

Не то же самое, но идея, которая работает в любом случае.

#!/bin/bash  
i='y'  
while [ ${i:0:1} != n ]  
do  
    # Command(s)  
    read -p " Again? Y/n " i  
    [[ ${#i} -eq 0 ]] && i='y'  
done  

Выход:
Снова? Да / Нет N
Снова? Да нет ничего
Снова? Да / нет 7
Снова? Да /
Снова? Да / нет nsijf
$

Теперь проверяет только 1-й символ $ i.

0 голосов
/ 13 июля 2010

Это не совсем «спрашивать да или нет», а просто взломать: псевдоним hg push ... не hgpushrepo, а hgpushrepoconfirmedpush, и к тому времени, когда я могу разобрать все целиком, слеваМозг сделал логичный выбор.

...