programing

bash 스크립트에서 사용자에게 확인 메시지를 표시하려면 어떻게 해야 합니까?

telebox 2023. 4. 27. 22:10
반응형

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

저는 레비슬레비스85의 제안을 통합했고 (감사합니다!) 추가했습니다.-n에 대한 선택권.read한 문자를 누를 필요 없이 사용할 수 있습니다.둘 중 하나 또는 둘 다 사용할 수 있습니다.

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

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 =~ ^(y| ) ]] || [[ -z $response ]]; then
    your-action-here
 fi

zsh를 사용하는 경우 다음을 시도합니다.

read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(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...
  • 출력은 항상 "예" 또는 "아니오"입니다.
  • 기본적으로 "아니오"입니다.
  • "y" 또는 "yes"를 제외한 모든 것은 "no"를 반환하므로 위험한 bash 스크립트에 매우 안전합니다.
  • 대소문자를 구분하지 않고 "Y", "YES" 또는 "YES"가 "YES"로 작동합니다.

마음에 드셨으면 좋겠습니다.
건배!

이것은 제가 다른 곳에서 찾은 것인데, 더 좋은 버전이 있을까요?

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

이 기능을 사용하여 기존 파일을 찾고 덮어쓰기 전에 프롬프트를 표시합니다.

echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

bash에서 읽고 결과를 에코백하기 위한 짧은 스크립트입니다.

qnd: 사용

read VARNAME
echo $VARNAME

리드라인 지원 없이 한 줄로 응답할 수 있습니다.그런 다음 원하는 대로 $VARNAME을 테스트합니다.

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

반응형