2009-12-11 37 views

Trả lời

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

Sửa:

tôi đưa levislevis85 's gợi ý (cảm ơn!) Và thêm tùy chọn -n-read chấp nhận một nhân vật mà không cần phải nhấn Nhập. Bạn có thể sử dụng một hoặc cả hai.

Ngoài ra, hình thức phủ nhận có thể trông như thế này:

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 

Tuy nhiên, như đã chỉ ra bởi Erich, dưới một số trường hợp như một lỗi cú pháp gây ra bởi kịch bản được chạy trong vỏ sai, phủ nhận biểu mẫu có thể cho phép tập lệnh tiếp tục với "nội dung nguy hiểm". Chế độ thất bại nên ưu tiên kết quả an toàn nhất nên chỉ sử dụng if đầu tiên, không được phủ nhận.

+0

cảm ơn, các dấu ngoặc vuông đôi làm gì? – Tom

+0

và điều đó có thể bị từ chối không? tức là nếu không khớp, hãy thoát? – Tom

+2

Nó có nhiều tính năng hơn '[]' bao gồm toán tử đối sánh regex '= ~'. Xem: http://mywiki.wooledge.org/BashFAQ/031 –

2

qnd: sử dụng

read VARNAME 
echo $VARNAME 

cho một phản ứng một dòng không nơi nương tựa readline. Sau đó, hãy thử nghiệm $ VARNAME theo ý bạn muốn.

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

Thử BUILTIN read shell:

read -p "Continue (y/n)?" CONT 
if [ "$CONT" = "y" ]; then 
    echo "yaaa"; 
else 
    echo "booo"; 
fi 
3
#!/bin/bash 
echo Please, enter your name 
read NAME 
echo "Hi $NAME!" 
if [ "x$NAME" = "xyes" ] ; then 
# do something 
fi 

tôi là một kịch bản ngắn để đọc trong bash và echo lại kết quả.

11

Điều này tôi tìm thấy ở nơi khác, có phiên bản tốt hơn có thể không?

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

trường hợp sử dụng/esac.

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

lợi thế:

  1. gọn gàng
  2. có thể sử dụng "OR" điều kiện dễ dàng hơn
  3. có thể sử dụng nhiều nhân vật, ví dụ [YY] [eE] [sS] để chấp nhận lời "yes" , bất kỳ ký tự nào của nó có thể là chữ thường hoặc chữ hoa.
+5

Giải pháp tốt. Cá nhân, nếu kịch bản bash thực sự có thể làm tê liệt tôi thích có người gõ 'có'. – SiegeX

+0

Làm thế nào tôi có thể sử dụng lệnh này để thoát khi đầu vào không có (có thể là "echo" Bỏ đoạn mã. "; Exit ;;'), nhưng nếu đầu vào là có, tập lệnh sẽ tiếp tục với bất kỳ thứ gì xuất hiện sau 'esac'? –

+0

Nếu bạn làm 'n | N), hãy trả lời" không "; return ;; 'kịch bản sẽ kết thúc ở đó nếu bạn nói 'n' và tiếp tục với phần còn lại nếu không, đó là ý của bạn? – Rellikiox

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

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

sử dụng chức năng này để tìm tệp hiện có và nhắc trước khi ghi đè.

+0

Trình phân tích cú pháp than phiền về hàm 'return' bên ngoài, có thể bạn có nghĩa là' thoát '. Tôi vẫn thích câu trả lời của bạn, bởi vì nó không thụt lề mã được thực hiện nếu được xác nhận. – dhill

23

Bằng cách này bạn sẽ có được 'y' 'có' hoặc 'Enter'

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

Không chấp nhận mặc định Y –

+1

Đối với mặc định Y nếu [[$ response = ~^(có | y |)]] | [-z $ hồi đáp]; sau đó –

16

Dưới đây là các chức năng tôi sử dụng:

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 
} 

Và một ví dụ sử dụng nó:

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... 
  • Kết quả luôn là "có" hoặc "không"
  • "Không" theo mặc định
  • Mọi thứ ngoại trừ "y" hoặc "có" đều trả về "không", vì vậy nó khá an toàn cho tập lệnh bash nguy hiểm
  • Và trường hợp không phân biệt chữ "Y", "Có" hoặc "CÓ" làm việc là "có".

Tôi hy vọng bạn thích nó,
Chúc mừng!

Các vấn đề liên quan