:
ksh -x test.sh -c -e file1 file2
- 的“-c”选项确实不有一个说法
- 的“-e”选项不有一个参数(即“文件1”)
如果是这种情况,请尝试在getopts
选项字符串去掉字母“C”后的冒号(:
),例如:
while getopts ":ce:" opt; do
如果这能解决您的问题...请继续阅读了解更多详情...
当冒号(:
)跟随在getopts
选项字符串的信,这表示该选项有一个参数,这反过来又意味着OPTARG将被设置为从所述命令行读取下一个项目。
如果getopts
选项字符串中的字母后没有冒号,则表示该选项没有参数,这意味着OPTARG将被取消设置。
我们可以看到此行为与下面的示例脚本:
对于我们期待我们的每一个选项(C,E)后的参数这第一个脚本 - 后注意冒号(:
)在getopts
选项字符串每个字母(C,E):
$ cat test1.sh
#!/bin/ksh
while getopts :c:e: opt
do
case $opt in
c) echo "c: OPTARG='${OPTARG:-undefined}'" ;;
e) echo "e: OPTARG='${OPTARG:-undefined}'" ;;
*) echo "invalid flag" ;;
esac
done
几个试验运行:
$ test1.sh -c -e file1
c: OPTARG='-e'
- 因为我们的'c'选项/标志后跟一个冒号(c :),'-e'被视为'-c'选项的参数;因为“-e”在这个穿过
getopts
消耗...
- 没有更多的选项标志来处理,因此
getopts
情况下为“E”选项是从来没有访问
$ test1.sh -c filex -e file1
c: OPTARG='filex'
e: OPTARG='file1'
- 因为我们提供了一个参数为我们的选项/标志(C,E),我们认为这是期望
现在两个getopts
箱子进行处理,如果我们不希望“-c '选项有一个参数,那么我们需要删除冒号(:
)后面的字母“C”在我们getopts
选项字符串:
$ cat test2.sh
#!/bin/ksh
while getopts :ce: opt
do
case $opt in
c) echo "c: OPTARG='${OPTARG:-undefined}'" ;;
e) echo "e: OPTARG='${OPTARG:-undefined}'" ;;
*) echo "invalid flag" ;;
esac
done
$ test2.sh -c -e file1
c: OPTARG='undefined'
e: OPTARG='file1'
- ,因为我们的“C”选项/标志不跟一个冒号,
getopts
不为下一次通过getopts
的“-e”选项/标志被处理并OPTARG被设置为“文件1”
从命令行,这意味着读取的任何更多的项目...
我试过,但我得到一个错误: – DaveMac001
语法错误在行xx:'&'意想不到 – DaveMac001
张贴块的作品。其他版本? 'ksh --version' is'sh(AT&T Research)93u + 2012-08-01'('ksh93') – toting