处理来自 Bash 用户的 Yes/No 响应

i_g*_*rok 11 bash

这很可能是我的愚蠢。我想在我的 Bash 脚本中接受 Yes/No、True/False 响应:

测试文件

#!/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
Run Code Online (Sandbox Code Playgroud)

以下是一些示例结果:

./test.sh 0

User passed in 0
Decline
Run Code Online (Sandbox Code Playgroud)

./test.sh 1

User passed in 1
Accept
Run Code Online (Sandbox Code Playgroud)

./test.sh 2

User passed in 2
Invalid argument
Run Code Online (Sandbox Code Playgroud)

./test.sh 否

User passed in No
Decline
Run Code Online (Sandbox Code Playgroud)

现在是树桩。为什么[[ "${OPTARG^^}" == "N" ]]对任何字符串都返回 true!?

./test.sh 是

User passed in Yes
Decline
Run Code Online (Sandbox Code Playgroud)

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline
Run Code Online (Sandbox Code Playgroud)

gol*_*cks 10

这个:

if [[ "$OPTARG" -eq 0 ]] 
Run Code Online (Sandbox Code Playgroud)

将匹配任何字符串,除非它只是数字。用:

if [[ "$OPTARG" == "0" ]] 
Run Code Online (Sandbox Code Playgroud)

反而。


dev*_*ull 8

尽管goldilocks已经很好地解释了您代码中的问题,但我还是忍不住说您的代码太长了。你可以简化很多。

以下等效于您想要的代码:

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
Run Code Online (Sandbox Code Playgroud)

您可能还需要参考条件结构手动


Rah*_*til 6

你也可以使用 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
Run Code Online (Sandbox Code Playgroud)