programing tip

Bash 스크립트에서 사용자에게 확인을 요청하는 방법은 무엇입니까?

itbloger 2020. 10. 4. 10:39
반응형

Bash 스크립트에서 사용자에게 확인을 요청하는 방법은 무엇입니까? [복제]


빨리 "확실합니까?" 잠재적으로 위험한 bash 스크립트의 맨 위에 확인 메시지가 표시됩니다.이 작업을 수행하는 가장 쉽고 / 가장 좋은 방법은 무엇입니까?


read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi

levislevis85 의 제안 (감사합니다!)을 통합 하고을 ( 를) 누를 필요없이 한 문자를 수락 하는 -n옵션을 추가했습니다 . 이들 중 하나 또는 둘 다를 사용할 수 있습니다.readEnter

또한 부정 형식은 다음과 같습니다.

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
fi

그러나 Erich가 지적한 바와 같이 잘못된 쉘에서 실행되는 스크립트로 인한 구문 오류와 같은 일부 상황에서는 부정 형식으로 인해 스크립트가 "위험한 작업"을 계속할 수 있습니다. 실패 모드는 가장 안전한 결과를 선호하므로 부정되지 않은 첫 번째 항목 만 if사용해야합니다.

설명:

read명령은 출력 프롬프트 ( -p "prompt")를 하나 개의 문자 (수용 -n 1) 및 (문자로 백 슬래시를 받아 -r(기타) read두 번째 문자가 빠져 나갈 및 대기로 백 슬래시를 볼 것). read결과를 저장하기 위한 기본 변수 $REPLY다음과 같은 이름을 제공하지 않는 경우입니다.read -p "my prompt" -n 1 -r my_var

if문 확인 정규 표현식을 사용하는 경우에 문자 $REPLY일치 ( =~) 상부 또는 하부 케이스 "Y". 여기에 사용 된 정규 표현식은 "( ^)로 시작 하고 대괄호 표현식 ( [Yy])과 끝 ( $) 의 문자 목록 중 하나로 만 구성된 문자열 "입니다. 앵커 ( ^$)는 긴 문자열 일치를 방지합니다. 이 경우 read명령에 설정된 한 문자 제한을 강화하는 데 도움이 됩니다.

부정 형식은 논리 "not"연산자 ( !)를 사용하여 =~"Y"또는 "y"가 아닌 모든 문자 를 일치 ( )합니다. 이것을 표현하는 다른 방법은 가독성이 떨어지며이 경우 제 생각에 의도를 명확하게 표현하지 않습니다. 그러나 이것은 다음과 같습니다.if [[ $REPLY =~ ^[^Yy]$ ]]


사용 사례 / esac.

read -p "Continue (y/n)?" choice
case "$choice" in 
  y|Y ) echo "yes";;
  n|N ) echo "no";;
  * ) echo "invalid";;
esac

이점:

  1. 깔끔한
  2. "OR"조건을 더 쉽게 사용할 수 있습니다.
  3. 문자 범위 (예 : [yY] [eE] [sS])를 사용하여 "yes"라는 단어를 허용 할 수 있습니다. 여기서 해당 문자는 소문자 또는 대문자 일 수 있습니다.

read쉘 내장을 사용해보십시오 .

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi

이렇게하면 'y' 'yes'또는 'Enter'가 표시됩니다.

 read -r -p "Are you sure? [Y/n]" response
 response=${response,,} # tolower
 if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
    your-action-here
 fi

zsh를 사용하는 경우 다음을 시도하십시오.

read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
    your-action-here
fi

내가 사용하는 기능은 다음과 같습니다.

function ask_yes_or_no() {
    read -p "$1 ([y]es or [N]o): "
    case $(echo $REPLY | tr '[A-Z]' '[a-z]') in
        y|yes) echo "yes" ;;
        *)     echo "no" ;;
    esac
}

그리고 그것을 사용하는 예 :

if [[ "no" == $(ask_yes_or_no "Are you sure?") || \
      "no" == $(ask_yes_or_no "Are you *really* sure?") ]]
then
    echo "Skipped."
    exit 0
fi

# Do something really dangerous...
  • 출력은 항상 "예"또는 "아니오"입니다.
  • 기본적으로 "아니오"입니다.
  • Everything except "y" or "yes" returns "no", so it's pretty safe for a dangerous bash script
  • And it's case insensitive, "Y", "Yes", or "YES" work as "yes".

I hope you like it,
Cheers!


This what I found elsewhere, is there a better possible version?

read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
   exit
fi

[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1

[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1

used this in a function to look for an existing file and prompt before overwriting.


#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

I s a short script to read in bash and echo back results.


qnd: use

read VARNAME
echo $VARNAME

for a one line response without readline support. Then test $VARNAME however you want.


echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi

참고URL : https://stackoverflow.com/questions/1885525/how-do-i-prompt-a-user-for-confirmation-in-bash-script

반응형