这很可能是我的愚蠢。我想在我的 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)
反而。
尽管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)
你也可以使用 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)