답변:
쉘 프롬프트에서 사용자 입력을 얻는 가장 단순하고 가장 널리 사용되는 방법은 read
명령입니다. 사용법을 설명하는 가장 좋은 방법은 간단한 데모입니다.
while true; do
read -p "Do you wish to install this program?" yn
case $yn in
[Yy]* ) make install; break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done
또 다른 방법으로, 지적 으로 스티븐 Huwig은 , 배쉬의입니다 select
명령. 다음은 동일한 예입니다 select
.
echo "Do you wish to install this program?"
select yn in "Yes" "No"; do
case $yn in
Yes ) make install; break;;
No ) exit;;
esac
done
으로 select
당신이 입력을 소독 할 필요가 없습니다 - 그것은 가능한 선택 사항을 표시합니다, 당신은 당신의 선택에 해당하는 번호를 입력합니다. 또한 자동으로 루프되므로 while true
잘못된 입력을 제공하는 경우 루프를 다시 시도 할 필요가 없습니다 .
또한, 레아 그리가 의 요청 언어 무신론자 만드는 방법 보여 그녀의 대답을 . 여러 언어를 더 잘 제공하기 위해 첫 번째 예를 적용하면 다음과 같습니다.
set -- $(locale LC_MESSAGES)
yesptrn="$1"; noptrn="$2"; yesword="$3"; noword="$4"
while true; do
read -p "Install (${yesword} / ${noword})? " yn
case $yn in
${yesptrn##^} ) make install; break;;
${noptrn##^} ) exit;;
* ) echo "Answer ${yesword} / ${noword}.";;
esac
done
분명히 다른 통신 문자열은 여기에서 번역되지 않은 채로 남아 있습니다 (설치, 답변). 더 완전한 완성 된 번역으로 해결해야하지만 부분 번역조차도 많은 경우에 도움이 될 것입니다.
exit
하는 break
내가 '더'를 선택하면 탭을 폐쇄하지 막기 위해.
break
의 select
경우에는 루프가 없다?
에 따라
그리고 원한다면
read
다음 명령을 사용할 수 있습니다 if ... then ... else
.
echo -n "Is this a good question (y/n)? "
read answer
# if echo "$answer" | grep -iq "^y" ;then
if [ "$answer" != "${answer#[Yy]}" ] ;then
echo Yes
else
echo No
fi
( Adam Katz의 의견에 감사드립니다 : 위의 테스트를 더 휴대하기 쉽고 포크 하나를 피하는 테스트로 대체했습니다.)
그러나 사용자가을 누르지 않게하려면 다음 Return과 같이 쓸 수 있습니다.
( 편집 : @JonathanLeffler가 올바르게 제안했듯이 stty의 구성을 저장 하는 것이 단순히 제자리 를 잡는 것보다 낫습니다 .)
echo -n "Is this a good question (y/n)? "
old_stty_cfg=$(stty -g)
stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty
if echo "$answer" | grep -iq "^y" ;then
echo Yes
else
echo No
fi
참고 : 이것은 아래에서 테스트되었습니다쉬, 세게 때리다, ksh, 대시 과 비지 박스!
동일하지만 명시 적으로 y또는 n:
#/bin/sh
echo -n "Is this a good question (y/n)? "
old_stty_cfg=$(stty -g)
stty raw -echo
answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done )
stty $old_stty_cfg
if echo "$answer" | grep -iq "^y" ;then
echo Yes
else
echo No
fi
사용하여 구축 된 다양한 도구가 있습니다 libncurses
, libgtk
, libqt
또는 다른 그래픽 라이브러리. 예를 들어, 사용 whiptail
:
if whiptail --yesno "Is this a good question" 20 60 ;then
echo Yes
else
echo No
fi
시스템에 따라 whiptail
다른 유사한 도구 로 교체해야 할 수도 있습니다 .
dialog --yesno "Is this a good question" 20 60 && echo Yes
gdialog --yesno "Is this a good question" 20 60 && echo Yes
kdialog --yesno "Is this a good question" 20 60 && echo Yes
여기서 20
대화 상자의 높이는 줄 수이며 60
대화 상자의 너비입니다. 이 도구들은 모두 거의 같은 구문을 가지고 있습니다 .
DIALOG=whiptail
if [ -x /usr/bin/gdialog ] ;then DIALOG=gdialog ; fi
if [ -x /usr/bin/xdialog ] ;then DIALOG=xdialog ; fi
...
$DIALOG --yesno ...
read -p "Is this a good question (y/n)? " answer
case ${answer:0:1} in
y|Y )
echo Yes
;;
* )
echo No
;;
esac
필요한 경우 case
테스트 할 수 있도록 사용하는 것을 선호 yes | ja | si | oui
합니다 ...
bash에서 read
명령 에 대한 의도 된 입력 길이를 지정할 수 있습니다 .
read -n 1 -p "Is this a good question (y/n)? " answer
bash에서 read
command는 시간 초과 매개 변수를 승인하는데 이는 유용 할 수 있습니다.
read -t 3 -n 1 -p "Is this a good question (y/n)? " answer
[ -z "$answer" ] && answer="Yes" # if 'yes' have to be default choice
간단한 yes - no
목적 이외의보다 정교한 대화 상자 :
dialog --menu "Is this a good question" 20 60 12 y Yes n No m Maybe
진행 표시 줄:
dialog --gauge "Filling the tank" 20 60 0 < <(
for i in {1..100};do
printf "XXX\n%d\n%(%a %b %T)T progress: %d\nXXX\n" $i -1 $i
sleep .033
done
)
작은 데모 :
#!/bin/sh
while true ;do
[ -x "$(which ${DIALOG%% *})" ] || DIALOG=dialog
DIALOG=$($DIALOG --menu "Which tool for next run?" 20 60 12 2>&1 \
whiptail "dialog boxes from shell scripts" >/dev/tty \
dialog "dialog boxes from shell with ncurses" \
gdialog "dialog boxes from shell with Gtk" \
kdialog "dialog boxes from shell with Kde" ) || exit
clear;echo "Choosed: $DIALOG."
for i in `seq 1 100`;do
date +"`printf "XXX\n%d\n%%a %%b %%T progress: %d\nXXX\n" $i $i`"
sleep .0125
done | $DIALOG --gauge "Filling the tank" 20 60 0
$DIALOG --infobox "This is a simple info box\n\nNo action required" 20 60
sleep 3
if $DIALOG --yesno "Do you like this demo?" 20 60 ;then
AnsYesNo=Yes; else AnsYesNo=No; fi
AnsInput=$($DIALOG --inputbox "A text:" 20 60 "Text here..." 2>&1 >/dev/tty)
AnsPass=$($DIALOG --passwordbox "A secret:" 20 60 "First..." 2>&1 >/dev/tty)
$DIALOG --textbox /etc/motd 20 60
AnsCkLst=$($DIALOG --checklist "Check some..." 20 60 12 \
Correct "This demo is useful" off \
Fun "This demo is nice" off \
Strong "This demo is complex" on 2>&1 >/dev/tty)
AnsRadio=$($DIALOG --radiolist "I will:" 20 60 12 \
" -1" "Downgrade this answer" off \
" 0" "Not do anything" on \
" +1" "Upgrade this anser" off 2>&1 >/dev/tty)
out="Your answers:\nLike: $AnsYesNo\nInput: $AnsInput\nSecret: $AnsPass"
$DIALOG --msgbox "$out\nAttribs: $AnsCkLst\nNote: $AnsRadio" 20 60
done
더 많은 샘플? USB 장치 및 USB 이동식 저장소 선택기 선택을 위해 whiptail 사용을 살펴보십시오 : USBKeyChooser
예:
#!/bin/bash
set -i
HISTFILE=~/.myscript.history
history -c
history -r
myread() {
read -e -p '> ' $1
history -s ${!1}
}
trap 'history -a;exit' 0 1 2 3 6
while myread line;do
case ${line%% *} in
exit ) break ;;
* ) echo "Doing something with '$line'" ;;
esac
done
이것은 파일이 만들어집니다 .myscript.history
당신에 $HOME
당신이 같이 작성한 Readline의 역사 명령을 사용할 수있는 것보다, 디렉토리 Up, Down, Ctrl+ r등이 있습니다.
stty
제공하는 -g
사용하기위한 옵션을 : old_stty=$(stty -g); stty raw -echo; …; stty "$old_stty"
. 이렇게하면 설정을 찾은 그대로 정확하게 복원 할 수 있으며, 설정과 같거나 같지 않을 수 있습니다 stty -sane
.
case
(와일드 카드 조건보다는 떠들썩한 파티 문자열을 사용으로 잘 배쉬로 POSIX에 대한 case $answer in; [Yy]* ) echo Yes ;;
),하지만 난 호의를 대신 조건문을 사용하여 선호 [ "$answer" != "${answer#[Yy]}" ]
이상 당신 echo "$answer" | grep -iq ^y
. 이식성이 뛰어나고 (GNU 이외의 일부 grep은 -q
올바르게 구현 되지 않음) 시스템 호출이 없습니다. ${answer#[Yy]}
매개 변수 확장을 사용하여을 (를) 제거 Y
하거나 y
시작 부분에서 시작하여 $answer
둘 중 하나가있을 때 불평등을 유발합니다. 이것은 모든 POSIX 셸 (대시, ksh, bash, zsh, busybox 등)에서 작동합니다.
echo "Please enter some input: "
read input_variable
echo "You entered: $input_variable"
내장 된 읽기 명령을 사용할 수 있습니다 . 이 -p
옵션을 사용하여 사용자에게 질문을하십시오.
BASH4부터는 이제 -i
답변을 제안하는 데 사용할 수 있습니다 .
read -e -p "Enter the path to the file: " -i "/usr/local/etc/" FILEPATH
echo $FILEPATH
(단 -e
, 화살표 키로 줄을 편집 하려면 "readline"옵션을 사용해야합니다 )
"예 / 아니오"논리를 원하면 다음과 같이 할 수 있습니다.
read -e -p "
List the content of your home dir ? [Y/n] " YN
[[ $YN == "y" || $YN == "Y" || $YN == "" ]] && ls -la ~/
FILEPATH
당신이 선택한 변수의 이름이고, 프롬프트 명령에 대한 응답으로 설정됩니다. 따라서 vlc "$FILEPATH"
예 를 들어을 실행 하면 vlc
해당 파일이 열립니다.
-e
두 번째 예에서 장점은 무엇입니까 (간단한 예 / 아니요)?
-e -p
대신에 사용해야 할 이유 는 -ep
무엇입니까?
-e
플래그 / 옵션이 없으면 (구현에 따라) "y"를 입력하지 못하고 마음을 바꾸고 "n"(또는 그 문제에 대한 다른 것)으로 바꿀 수 있습니다. 명령을 문서화 할 때 옵션을 별도로 나열하면 가독성 / 명확성이 향상됩니다.
Bash는 이 목적으로 선택 했습니다.
select result in Yes No Cancel
do
echo $result
done
exit
안을 추가 할 때까지 :)
Ctrl-D
. 그러나 물론, 그것을 사용하는 실제 코드는 본문에서 휴식이나 출구가 필요합니다.)
exit
스크립트를 모두 break
종료하고 현재있는 루프 만 종료합니다 ( while
또는 case
루프 에있는 경우 )
다음은 제가 함께 정리 한 것입니다.
#!/bin/sh
promptyn () {
while true; do
read -p "$1 " yn
case $yn in
[Yy]* ) return 0;;
[Nn]* ) return 1;;
* ) echo "Please answer yes or no.";;
esac
done
}
if promptyn "is the sky blue?"; then
echo "yes"
else
echo "no"
fi
나는 초보자이므로 소금 한알로 이것을 가져 가면 효과가있는 것 같습니다.
case $yn in
에 case ${yn:-$2} in
다음 기본값으로 두 번째 인수를 사용하여, Y 또는 N
case $yn
하는 case "${yn:-Y}"
기본값으로 예 갖도록
inquire () {
echo -n "$1 [y/n]? "
read answer
finish="-1"
while [ "$finish" = '-1' ]
do
finish="1"
if [ "$answer" = '' ];
then
answer=""
else
case $answer in
y | Y | yes | YES ) answer="y";;
n | N | no | NO ) answer="n";;
*) finish="-1";
echo -n 'Invalid response -- please reenter:';
read answer;;
esac
fi
done
}
... other stuff
inquire "Install now?"
...
do_xxxx=y # In batch mode => Default is Yes
[[ -t 0 ]] && # If TTY => Prompt the question
read -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx # Store the answer in $do_xxxx
if [[ $do_xxxx =~ ^(y|Y|)$ ]] # Do if 'y' or 'Y' or empty
then
xxxx
fi
[[ -t 0 ]] && read ...
=> read
TTY 인 경우 호출 명령read -n 1
=> 한 문자를 기다립니다$'\e[1;32m ... \e[0m '
=> 녹색으로 인쇄 [[ $do_xxxx =~ ^(y|Y|)$ ]]
=> bash 정규식do_xxxx=y
[[ -t 0 ]] && { # Timeout 5 seconds (read -t 5)
read -t 5 -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx || # read 'fails' on timeout
do_xxxx=n ; } # Timeout => answer No
if [[ $do_xxxx =~ ^(y|Y|)$ ]]
then
xxxx
fi
가장 적은 수의 행으로이를 달성하는 가장 쉬운 방법은 다음과 같습니다.
read -p "<Your Friendly Message here> : y/n/cancel" CONDITION;
if [ "$CONDITION" == "y" ]; then
# do something here!
fi
이 if
예는 단지 예일뿐입니다.이 변수를 처리하는 방법은 사용자에게 달려 있습니다.
다음 read
명령을 사용하십시오 .
echo Would you like to install? "(Y or N)"
read x
# now check if $x is "y"
if [ "$x" = "y" ]; then
# do something here!
fi
그런 다음 필요한 다른 모든 것들
멋진 ncurses와 같은 입력 상자 를 얻으려면 다음과 같은 명령 대화 상자를 사용하십시오 .
#!/bin/bash
if (dialog --title "Message" --yesno "Want to do something risky?" 6 25)
# message box will have the size 25x6 characters
then
echo "Let's do something risky"
# do something risky
else
echo "Let's stay boring"
fi
POSIX 쉘에서 로케일 인식 "예 / 아니오 선택"을 처리 할 수 있습니다. LC_MESSAGES
로케일 범주 의 항목을 사용하여 마녀는 입력과 일치하는 기성품 RegEx 패턴과 현지화 된 문자열을 제공합니다. 예 아니요.
#!/usr/bin/env sh
# Getting LC_MESSAGES values into variables
# shellcheck disable=SC2046 # Intended IFS splitting
IFS='
' set -- $(locale LC_MESSAGES)
yesexpr="$1"
noexpr="$2"
yesstr="$3"
nostr="$4"
messages_codeset="$5" # unused here, but kept as documentation
# Display Yes / No ? prompt into locale
echo "$yesstr / $nostr ?"
# Read answer
read -r yn
# Test answer
case "$yn" in
# match only work with the character class from the expression
${yesexpr##^}) echo "answer $yesstr" ;;
${noexpr##^}) echo "answer $nostr" ;;
esac
편집 : @ Urhixidur 가 그의 의견 에서 언급했듯이 :
불행하게도 POSIX는 처음 두 개 (yesexpr 및 noexpr) 만 지정합니다. 우분투 16에서 yesstr과 nostr은 비어 있습니다.
참조 : https://www.ee.ryerson.ca/~courses/ele709/susv4/xrat/V4_xbd_chap07.html#tag_21_07_03_06
LC_MESSAGES
yesstr
및nostr
로케일 키워드와YESSTR
및NOSTR
항목 langinfo는 이전에 일치하는 사용자 긍정과 부정 응답에 사용되었다. POSIX.1-2008에서,는yesexpr
,noexpr
,YESEXPR
, 및NOEXPR
확장 정규 표현식을 대체했다. 애플리케이션은 일반 로케일 기반 메시징 기능을 사용하여 원하는 응답 샘플이 포함 된 프롬프트 메시지를 발행해야합니다.
또는 Bash 방식으로 로케일을 사용하십시오.
#!/usr/bin/env bash
IFS=$'\n' read -r -d '' yesexpr noexpr _ < <(locale LC_MESSAGES)
printf -v yes_or_no_regex "(%s)|(%s)" "$yesexpr" "$noexpr"
printf -v prompt $"Please answer Yes (%s) or No (%s): " "$yesexpr" "$noexpr"
declare -- answer=;
until [[ "$answer" =~ $yes_or_no_regex ]]; do
read -rp "$prompt" answer
done
if [[ -n "${BASH_REMATCH[1]}" ]]; then
echo $"You answered: Yes"
else
echo $"No, was your answer."
fi
답변은 로케일 환경에서 제공되는 정규 표현식을 사용하여 일치합니다.
나머지 메시지를 번역하려면 bash --dump-po-strings scriptname
현지화를위한 po 문자열을 출력하는 데 사용 하십시오.
#: scriptname:8
msgid "Please answer Yes (%s) or No (%s): "
msgstr ""
#: scriptname:17
msgid "You answered: Yes"
msgstr ""
#: scriptname:19
msgid "No, was your answer."
msgstr ""
yesexpr
와 noexpr
쉘 환경에서은, 배쉬의 특정 정규식 매칭에 사용입니다if [[ "$yn" =~ $yesexpr ]]; then echo $"Answered yes"; else echo $"Answered no"; fi
더 길지만 재사용 가능한 모듈 식 접근 방식은 다음과 같습니다.
0
= yes와 1
= no를 반환zsh
와 모두 에 적용 bash
됩니다.(가) 있습니다 N
capitalsed된다. 여기에서 enter를 누르면 기본값이 적용됩니다.
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]?
또한 [y/N]?
자동으로 추가되었습니다. 기본 "no"가 허용되므로 아무 것도 에코되지 않습니다.
유효한 응답이 제공 될 때까지 다시 프롬프트하십시오.
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]? X
Show dangerous command [y/N]? y
rm *
(가) 있습니다 Y
대문자입니다 :
$ confirm_yes "Show dangerous command" && echo "rm *"
Show dangerous command [Y/n]?
rm *
위의 Enter 키를 누르면 명령이 실행되었습니다.
y
또는n
$ get_yes_keypress "Here you cannot press enter. Do you like this [y/n]? "
Here you cannot press enter. Do you like this [y/n]? k
Here you cannot press enter. Do you like this [y/n]?
Here you cannot press enter. Do you like this [y/n]? n
$ echo $?
1
여기에서, 1
또는 거짓이 반환되었습니다. 이 하위 수준 기능을 사용하면 고유 한 [y/n]?
프롬프트 를 제공해야 합니다.
# Read a single char from /dev/tty, prompting with "$*"
# Note: pressing enter will return a null string. Perhaps a version terminated with X and then remove it in caller?
# See https://unix.stackexchange.com/a/367880/143394 for dealing with multi-byte, etc.
function get_keypress {
local REPLY IFS=
>/dev/tty printf '%s' "$*"
[[ $ZSH_VERSION ]] && read -rk1 # Use -u0 to read from STDIN
# See https://unix.stackexchange.com/q/383197/143394 regarding '\n' -> ''
[[ $BASH_VERSION ]] && </dev/tty read -rn1
printf '%s' "$REPLY"
}
# Get a y/n from the user, return yes=0, no=1 enter=$2
# Prompt using $1.
# If set, return $2 on pressing enter, useful for cancel or defualting
function get_yes_keypress {
local prompt="${1:-Are you sure [y/n]? }"
local enter_return=$2
local REPLY
# [[ ! $prompt ]] && prompt="[y/n]? "
while REPLY=$(get_keypress "$prompt"); do
[[ $REPLY ]] && printf '\n' # $REPLY blank if user presses enter
case "$REPLY" in
Y|y) return 0;;
N|n) return 1;;
'') [[ $enter_return ]] && return "$enter_return"
esac
done
}
# Credit: http://unix.stackexchange.com/a/14444/143394
# Prompt to confirm, defaulting to NO on <enter>
# Usage: confirm "Dangerous. Are you sure?" && rm *
function confirm {
local prompt="${*:-Are you sure} [y/N]? "
get_yes_keypress "$prompt" 1
}
# Prompt to confirm, defaulting to YES on <enter>
function confirm_yes {
local prompt="${*:-Are you sure} [Y/n]? "
get_yes_keypress "$prompt" 0
}
Show dangerous command [y/N]? [y/n]?
및Show dangerous command [Y/n]? [y/n]?
오래된 게시물에 게시하여 죄송합니다. 몇 주 전에 비슷한 문제가 발생했습니다. 필자의 경우 온라인 설치 프로그램 스크립트에서 작동하는 솔루션이 필요했습니다.curl -Ss https://raw.github.com/_____/installer.sh | bash
사용 read yesno < /dev/tty
나를 위해 좋은 일을 :
echo -n "These files will be uploaded. Is this ok? (y/n) "
read yesno < /dev/tty
if [ "x$yesno" = "xy" ];then
# Yes
else
# No
fi
이것이 누군가를 돕기를 바랍니다.
tty
입력 한 것과 마찬가지로 입력 을 수락 하고 잘못된 입력을 반복했습니다 (버퍼에 몇 문자를 상상하십시오.이 방법은 사용자가 항상 아니오를 선택하도록 강요합니다 ).
나는 그런 간단한 사용자 입력을 위해 여러 줄 에코 메뉴를 보여주는 답변을 게시 한 사람이 아무도 없다는 것을 알았습니다.
#!/bin/bash
function ask_user() {
echo -e "
#~~~~~~~~~~~~#
| 1.) Yes |
| 2.) No |
| 3.) Quit |
#~~~~~~~~~~~~#\n"
read -e -p "Select 1: " choice
if [ "$choice" == "1" ]; then
do_something
elif [ "$choice" == "2" ]; then
do_something_else
elif [ "$choice" == "3" ]; then
clear && exit 0
else
echo "Please select 1, 2, or 3." && sleep 3
clear && ask_user
fi
}
ask_user
이 방법은 누군가가 유용하고 시간을 절약 할 수 있기를 바랍니다.
객관식 버전 :
ask () { # $1=question $2=options
# set REPLY
# options: x=..|y=..
while $(true); do
printf '%s [%s] ' "$1" "$2"
stty cbreak
REPLY=$(dd if=/dev/tty bs=1 count=1 2> /dev/null)
stty -cbreak
test "$REPLY" != "$(printf '\n')" && printf '\n'
(
IFS='|'
for o in $2; do
if [ "$REPLY" = "${o%%=*}" ]; then
printf '\n'
break
fi
done
) | grep ^ > /dev/null && return
done
}
예:
$ ask 'continue?' 'y=yes|n=no|m=maybe'
continue? [y=yes|n=no|m=maybe] g
continue? [y=yes|n=no|m=maybe] k
continue? [y=yes|n=no|m=maybe] y
$
(스크립트 내부)로 설정 REPLY
됩니다 y
.
Linux Apprentice : 대화 상자를 사용하여 Bash Shell 스크립트 개선
대화 상자 명령을 사용하면 쉘 스크립트에서 창 상자를 사용하여 대화식으로 사용할 수 있습니다.
간단하고 사용하기 쉬우 며 gdialog라는 그놈 버전도 있습니다.이 버전에는 정확히 동일한 매개 변수를 사용하지만 X에서 GUI 스타일을 보여줍니다.
@Mark와 @Myrddin의 답변에서 영감을 받아 범용 프롬프트를 위해이 기능을 만들었습니다.
uniprompt(){
while true; do
echo -e "$1\c"
read opt
array=($2)
case "${array[@]}" in *"$opt"*) eval "$3=$opt";return 0;; esac
echo -e "$opt is not a correct value\n"
done
}
다음과 같이 사용하십시오.
unipromtp "Select an option: (a)-Do one (x)->Do two (f)->Do three : " "a x f" selection
echo "$selection"
더 일반적인 것은 다음과 같습니다.
function menu(){
title="Question time"
prompt="Select:"
options=("Yes" "No" "Maybe")
echo "$title"
PS3="$prompt"
select opt in "${options[@]}" "Quit/Cancel"; do
case "$REPLY" in
1 ) echo "You picked $opt which is option $REPLY";;
2 ) echo "You picked $opt which is option $REPLY";;
3 ) echo "You picked $opt which is option $REPLY";;
$(( ${#options[@]}+1 )) ) clear; echo "Goodbye!"; exit;;
*) echo "Invalid option. Try another one.";continue;;
esac
done
return
}
이를 수행하는 간단한 방법 중 하나는 with xargs -p
또는 gnu parallel --interactive
입니다.
xargs의 동작은 마지막에 실행할 yesses를 수집하는 대신 다른 대화식 unix 명령과 같이 프롬프트 직후에 각 명령을 실행하기 때문에 조금 더 좋습니다. (원하는 것을 겪은 후에 Ctrl-C를 사용할 수 있습니다.)
예를 들어
echo *.xml | xargs -p -n 1 -J {} mv {} backup/
xargs --interactive
는 않지만 예 또는 아니오로 제한됩니다. 그것이 충분하면 충분할 수 있지만, 원래의 질문은 세 가지 가능한 결과를 가진 예를 보여주었습니다. 나는 그것이 스트리밍 가능하다는 것을 정말로 좋아합니다. 많은 일반적인 시나리오는 파이프 기능을 통해 이점을 얻을 수 있습니다.
한 줄 명령의 친구로서 다음을 사용했습니다.
while [ -z $prompt ]; do read -p "Continue (y/n)?" choice;case "$choice" in y|Y ) prompt=true; break;; n|N ) exit 0;; esac; done; prompt=;
longform으로 작성하면 다음과 같이 작동합니다.
while [ -z $prompt ];
do read -p "Continue (y/n)?" choice;
case "$choice" in
y|Y ) prompt=true; break;;
n|N ) exit 0;;
esac;
done;
prompt=;
내가 사용했습니다 case
그것에 대해 갈 수있는 좋은 방법을 사례 한 Statment이다 사용하여 이러한 시나리오에 문을 몇 번. 프로그램을 더 많이 제어하고 다른 많은 요구 사항을 충족시키기 위해 부울 조건을 사용하는 블록 while
을 캡슐화 하는 루프를 case
구현할 수 있습니다. 모든 조건이 충족되면 break
제어 기능을 프로그램의 주요 부분으로 다시 전달할 수 있습니다. 또한 다른 조건을 충족시키기 위해 제어 구조와 함께 조건문을 추가 할 수 있습니다 : case
명령문 및 가능한 while
루프.
case
진술을 사용 하여 요청을 이행 하는 예
#! /bin/sh
# For potential users of BSD, or other systems who do not
# have a bash binary located in /bin the script will be directed to
# a bourne-shell, e.g. /bin/sh
# NOTE: It would seem best for handling user entry errors or
# exceptions, to put the decision required by the input
# of the prompt in a case statement (case control structure),
echo Would you like us to perform the option: "(Y|N)"
read inPut
case $inPut in
# echoing a command encapsulated by
# backticks (``) executes the command
"Y") echo `Do something crazy`
;;
# depending on the scenario, execute the other option
# or leave as default
"N") echo `execute another option`
;;
esac
exit
#!/usr/bin/env bash
@confirm() {
local message="$*"
local result=''
echo -n "> $message (Yes/No/Cancel) " >&2
while [ -z "$result" ] ; do
read -s -n 1 choice
case "$choice" in
y|Y ) result='Y' ;;
n|N ) result='N' ;;
c|C ) result='C' ;;
esac
done
echo $result
}
case $(@confirm 'Confirm?') in
Y ) echo "Yes" ;;
N ) echo "No" ;;
C ) echo "Cancel" ;;
esac
#!/usr/bin/env bash
@confirm() {
local message="$*"
local result=3
echo -n "> $message (y/n) " >&2
while [[ $result -gt 1 ]] ; do
read -s -n 1 choice
case "$choice" in
y|Y ) result=0 ;;
n|N ) result=1 ;;
esac
done
return $result
}
if @confirm 'Confirm?' ; then
echo "Yes"
else
echo "No"
fi
yn() {
if [[ 'y' == `read -s -n 1 -p "[y/n]: " Y; echo $Y` ]];
then eval $1;
else eval $2;
fi }
yn 'echo yes' 'echo no'
yn 'echo absent no function works too!'
yn(){ read -s -n 1 -p '[y/n]'; test "$REPLY" = "y" ; } yn && echo success || echo failure
다른 사람들에 대한 답변 :
BASH4에서 대소 문자를 지정할 필요는 없습니다. ',,'를 사용하여 var를 소문자로 만드십시오. 또한 읽기 블록 내부에 코드를 넣는 것을 싫어하고 결과를 가져 와서 읽기 블록 IMO 외부에서 처리합니다. 종료 IMO에는 'q'도 포함하십시오. 마지막으로 'yes'유형이 왜 -n1을 사용하고 y를 누르십시오.
예 : 사용자는 y / n을 누르고 q를 눌러 종료 할 수 있습니다.
ans=''
while true; do
read -p "So is MikeQ the greatest or what (y/n/q) ?" -n1 ans
case ${ans,,} in
y|n|q) break;;
*) echo "Answer y for yes / n for no or q for quit.";;
esac
done
echo -e "\nAnswer = $ans"
if [[ "${ans,,}" == "q" ]] ; then
echo "OK Quitting, we will assume that he is"
exit 0
fi
if [[ "${ans,,}" == "y" ]] ; then
echo "MikeQ is the greatest!!"
else
echo "No? MikeQ is not the greatest?"
fi
[yn]
옵션 을 제시하면 대문자로 된 옵션이 기본값입니다 (예 :[Yn]
기본값은 "yes",[yN]
기본값은 "no"). 참조 ux.stackexchange.com/a/40445/43532