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
옵션을 추가했습니다 . 이들 중 하나 또는 둘 다를 사용할 수 있습니다.read
Enter
또한 부정 형식은 다음과 같습니다.
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
이점:
- 깔끔한
- "OR"조건을 더 쉽게 사용할 수 있습니다.
- 문자 범위 (예 : [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
'programing tip' 카테고리의 다른 글
n에서 k 요소의 모든 조합을 반환하는 알고리즘 (0) | 2020.10.04 |
---|---|
PostgreSQL 자동 증가 (0) | 2020.10.04 |
JavaScript에서 정확히 두 개의 소수로 숫자 서식 지정 (0) | 2020.10.04 |
JavaScript에서 클라이언트의 시간대 오프셋 가져 오기 (0) | 2020.10.04 |
OutputStream을 문자열로 가져 오기 (0) | 2020.10.04 |