Xử lý phản hồi Có / Không từ Người dùng Bash


11

Điều này rất tốt có thể là ngu ngốc về phía tôi. Tôi muốn chấp nhận câu trả lời Có / Không, Đúng / Sai trong tập lệnh Bash của tôi:

kiểm tra

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

Dưới đây là một số kết quả mẫu:

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh Không

User passed in No
Decline

Bây giờ là người ném đá. Tại sao [[ "${OPTARG^^}" == "N" ]]trả về đúng cho bất kỳ chuỗi nào!?

./test.sh Có

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

Điều gì xảy ra nếu bạn trích dẫn điều này? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeerv 15/03/2016

1
Đừng bận tâm. Goldilocks là đúng.
mikeerv 15/03/2016

Câu trả lời:


10

Điều này:

if [[ "$OPTARG" -eq 0 ]] 

Sẽ khớp với bất kỳ chuỗi nào, trừ khi nó chỉ là chữ số. Sử dụng:

if [[ "$OPTARG" == "0" ]] 

Thay thế.


8

Mặc dù vấn đề trong mã của bạn đã được giải thích rõ ràng bằng goldilocks , tôi không thể cưỡng lại việc nói rằng mã của bạn dài không cần thiết. Bạn có thể đơn giản hóa nó rất nhiều.

Sau đây là tương đương với mã mong muốn của bạn:

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

Bạn cũng có thể muốn tham khảo Cấu trúc có điều kiện trong hướng dẫn .


Cảm ơn bạn, hết sức. Tôi chắc chắn sẽ sử dụng thủ thuật này trong các kịch bản trong tương lai! Tôi không biết liệu tôi có nên chấp nhận câu trả lời của bạn không, nhưng tôi nghĩ rằng sự khác biệt trong câu trả lời của goldilocks có thể hữu ích cho người khác.
i_grok 16/03 '

@i_grok Tôi đã đề cập đến trong câu trả lời của mình rằng câu trả lời của goldilocks chỉ ra vấn đề. Tôi chỉ đơn giản là trình bày một cách tiếp cận thay thế mà dường như dễ đọc hơn . Thật tốt khi thấy nhiều cách tiếp cận để giải quyết vấn đề được đưa ra. Về câu trả lời được chấp nhận là một vấn đề tương đối tầm thường.
devnull

6

Ngoài ra bạn có thể sử dụng case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.