我正在使用一个 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 为真。那么如何使这些选项区分大小写呢?
在您的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)
| 归档时间: |
|
| 查看次数: |
2455 次 |
| 最近记录: |