В Bash, как добавить, “Вы уверенный [Y/n]” к какой-либо команде или псевдониму?

Я не могу воспроизвести эту проблему, но вы написали, что это довольно неловкий способ, IMO. Вы хотите, чтобы все было Double, поэтому просто сделайте это Double, и тогда код станет намного проще, и вам не понадобится все приведение. pow(x,2) также является очень дорогим способом вычисления x*x, поэтому я бы избавился от этого, и я думаю, что код становится намного проще и определенно не имеет проблем с компиляцией.

func cal(xs: [Int], ys: [Int64]) -> Double {
    let xs = xs.lazy.map(Double.init)
    let ys = ys.lazy.map(Double.init)

    let total = ys.reduce(0, +)
    return zip(xs, ys).map { [110]*[110] * $1 }.reduce(0, +) / total
}

Если вы делаете много такого рода кода, вы можете найти расширение sum() полезным, чтобы сделать код немного понятнее.

extension Sequence where Element: Numeric {
    func sum() -> Element {
        return reduce(0, +)
    }
}

func cal(xs: [Int], ys: [Int64]) -> Double {
    let xs = xs.lazy.map(Double.init)
    let ys = ys.lazy.map(Double.init)

    let total = ys.sum()
    return zip(xs, ys).map { [111]*[111] * $1 }.sum() / total
}
211
задан nopole 7 April 2017 в 12:04
поделиться

8 ответов

Это более компактные и универсальные формы ответа Hamish's. Они обрабатывают любую смесь строчных и прописных букв:

read -r -p "Are you sure? [y/N] " response
case "$response" in
    [yY][eE][sS]|[yY]) 
        do_something
        ;;
    *)
        do_something_else
        ;;
esac

Или, для Bash >= версии 3.2:

read -r -p "Are you sure? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]
then
    do_something
else
    do_something_else
fi

Примечание: Если $response - пустая строка, это приведет к ошибке. Чтобы исправить, просто добавьте кавычки: "$response". - Всегда используйте двойные кавычки в переменных, содержащих строки (например: лучше использовать "$@" вместо $@).

Или, Bash 4.x:

read -r -p "Are you sure? [y/N] " response
response=${response,,}    # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
...

Правка:

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

confirm() {
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case "$response" in
        [yY][eE][sS]|[yY]) 
            true
            ;;
        *)
            false
            ;;
    esac
}

Чтобы использовать эту функцию:

confirm && hg push ssh://..

или

confirm "Would you really like to do a push?" && hg push ssh://..
306
ответ дан 23 November 2019 в 04:33
поделиться

Эта версия позволяет Вам иметь больше чем один случай y или Y, n или N

  1. Дополнительно: Повторите вопрос, пока утвердить вопрос не будет обеспечен

  2. Дополнительно: Проигнорируйте любой другой ответ

  3. Дополнительно: Выйдите из терминала, если Вы хотите

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) break ;;        # exit case statement gracefully
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }
    

Уведомление это также: На последней строке этой функции очищают переменную ОТВЕТА. Иначе, если Вы echo $REPLY Вы будете видеть, что это все еще установлено, пока Вы не открываете или не закрываете свой терминал или устанавливаете его снова.

2
ответ дан 23 November 2019 в 04:33
поделиться

Вот примерно тот фрагмент, который вам нужен. Позвольте мне выяснить, как переслать аргументы.

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt == "y" || $prompt == "Y" || $prompt == "yes" || $prompt == "Yes" ]]
then
  # http://stackoverflow.com/questions/1537673/how-do-i-forward-parameters-to-other-command-in-bash-script
else
  exit 0
fi

Следите за yes | имя команды здесь :)

19
ответ дан 23 November 2019 в 04:33
поделиться

Чтобы избежать явной проверки этих вариантов «да», вы можете использовать оператор регулярного выражения bash '= ~' с регулярное выражение:

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt =~ [yY](es)* ]]
then
(etc...)

Это проверяет, начинается ли ввод пользователя с «y» или «Y» и сопровождается нулем или более «es».

11
ответ дан 23 November 2019 в 04:33
поделиться
read -r -p "Are you sure? [Y/n]" response
  response=${response,,} # tolower
  if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
      your-action-here
  fi
3
ответ дан 23 November 2019 в 04:33
поделиться

Добавьте следующее в ваш файл /etc/bashrc. Этот скрипт добавляет резидентную "функцию" вместо псевдонима "confirm".


function confirm( )
{
#alert the user what they are about to do.
echo "About to $@....";
#confirm with the user
read -r -p "Are you sure? [Y/n]" response
case "$response" in
    [yY][eE][sS]|[yY]) 
              #if yes, then execute the passed parameters
               "$@"
               ;;
    *)
              #Otherwise exit...
              echo "ciao..."
              exit
              ;;
esac
}
3
ответ дан 23 November 2019 в 04:33
поделиться

Это не совсем "вопрос да или нет", а просто хак: псевдоним hg push ... не на hgpushrepo, а на hgpushrepoconfirmedpush, и к тому времени, как я смогу все это прописать, левый мозг сделает логический выбор.

0
ответ дан 23 November 2019 в 04:33
поделиться

Это может быть хаком:

как в вопросе В Unix / Bash, является ли "xargs -p" хорошим способом запросить подтверждение перед выполнением любой команды?

мы можем использовать xargs, чтобы сделать эту работу:

echo ssh://username@www.example.com//somepath/morepath | xargs -p hg push

конечно, это будет установлено как псевдоним, как hgpushrepo

Пример:

$ echo foo | xargs -p ls -l
ls -l foo?...y
-rw-r--r--  1 mikelee    staff  0 Nov 23 10:38 foo

$ echo foo | xargs -p ls -l
ls -l foo?...n

$
5
ответ дан 23 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

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