如何使GETOPTS选项字符串选项区分大小写?

use*_*889 1 bash shell

我正在使用一个 shell 脚本,其中包括以下两个选项:

OPT1=false
OPT2=false

while getopts "Alfqru:p:x:s:a:b:c:t:z:" opt; do
  case $opt in
    A) OPT1=true
       ;;
    a) OPT2=true
       ;;
    esac
done
Run Code Online (Sandbox Code Playgroud)

现在,当我使用 -a 或 -A 运行此脚本时,OPT1 设置为 true,OPT2 设置为 false。当我颠倒两种情况时,情况正好相反。我想要的是 -A 使 OPT1 为真,-a 使 OPT2 为真。那么如何使这些选项区分大小写呢?

sjs*_*sam 5

在您的getopts命令中,您在 smalla后面放了一个冒号,这意味着它需要一个参数。不知道你是不是不小心放了这个。

在这种情况下 getopts 将不接受该a参数,除非您为此输入了参数。IE

./example -a导致错误./example: option requires an argument -- a &

./example -a some_value 运行良好

这就是optstring的设计所发生的情况。

注意以下脚本中的上述事实,我将其命名为example:

#!/bin/bash
OPT1=false
OPT2=false
while getopts :Alfqru:p:x:s:a:b:c:t:z: opt 
do
case $opt in
A) OPT1="true";;
a) OPT2="true";;
esac
done
echo "OPT1 : " $OPT1
echo "OPT2 : " $OPT2
Run Code Online (Sandbox Code Playgroud)

(请注意,我:在 getopts 前面放了一个OPTSTRING以抑制错误)

给我 :

$ ./example -Aa
OPT1 :  true
OPT2 :  false
Run Code Online (Sandbox Code Playgroud)

这里第二个参数 a 应该有一个参数但是我们没有输入它所以 getopts 没有接受它,所以你的 OPT2 是假的。

$ ./example -aA
OPT1 :  false
OPT2 :  true
Run Code Online (Sandbox Code Playgroud)

这里只有一个毕竟因为参数一个下面a将被视为参数a。A,参数将存储在$OPTARG

$ ./example -a -A
OPT1 :  false
OPT2 :  true
Run Code Online (Sandbox Code Playgroud)

这里也只有一个参数,因为在-A后面a将被视为参数a。-A,参数将存储在$OPTARG

$ ./example -a somevalue -A
OPT1 :  true
OPT2 :  true
Run Code Online (Sandbox Code Playgroud)

这是预期的行为。

$ ./example -Aa somevalue
OPT1 :  true
OPT2 :  true
Run Code Online (Sandbox Code Playgroud)

这也是预期的行为。

您可能会考虑采取关闭:后a,如果你已经把它偶然。然后你会得到:

$ ./example -Aa
    OPT1 :  true
    OPT2 :  true
Run Code Online (Sandbox Code Playgroud)

&

$ ./example -aA
    OPT1 :  true
    OPT2 :  true
Run Code Online (Sandbox Code Playgroud)