处理Bash用户的是/否响应


11

我觉得这很愚蠢。我想在我的Bash脚本中接受“是/否,正确/错误”响应:

test.sh

#!/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

以下是一些示例结果:

./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否

User passed in No
Decline

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

./test.sh是

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

如果您引用此内容会怎样?OPTARG =“ $ {ARGUMENT:0:1}”
mikeserv

1
没关系。金发姑娘是对的。
mikeserv

Answers:


10

这个:

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

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

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

代替。


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

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


谢谢,devnull。我肯定会在以后的脚本中使用此技巧!对于是否应该接受您的回答,我感到不安,但我认为金发姑娘的回答中的区别可能对其他人有所帮助。
i_grok 2014年

@i_grok我在回答中确实提到了goldilocks的答案指出了这个问题。我只是提出了一种似乎更易读的替代方法。很高兴看到解决问题的多种方法。关于接受哪个答案是一个相对琐碎的事情。
devnull 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.