下面的while循环存在于我的shell中,名为test.sh
我想运行以下命令
ksh -x test.sh -c -e file1 file2
我希望while循环首先执行c)case然后e)循环中的case,但是此时它只执行c)case
有人可以建议如何让它同时执行吗?首先c)然后e)
while getopts ":c:e:" opt; do
case $opt in
c)
gzip -9 archivedfile
;;
e)
ksh test2.sh archivedfile
;;
esac
shift
done
答案 0 :(得分:2)
基于您的示例脚本调用:
ksh -x test.sh -c -e file1 file2
如果是这种情况,请尝试删除:
选项字符串中字母“c”后面的冒号(getopts
),例如:
while getopts ":ce:" opt; do
如果这可以解决您的问题...请继续阅读以获取更多详细信息......
当冒号(:
)跟在getopts
选项字符串中的一个字母后面时,这表示该选项有一个参数,这反过来意味着OPTARG将被设置为从中读取的下一个项目命令行。
当getopts
选项字符串中的字母后面没有冒号时,这表示该选项没有参数,这反过来意味着OPTARG将被取消设置。
我们可以使用以下示例脚本看到此行为:
对于第一个脚本,我们期望在每个选项(c,e)之后出现一个参数 - 注意:
选项中每个字母(c,e)后面的冒号(getopts
)字符串:
$ 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'
getopts
... getopts
个案$ test1.sh -c filex -e file1
c: OPTARG='filex'
e: OPTARG='file1'
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'
getopts
不再从命令行读取任何项目,这意味着... getopts
时,' - ''选项/标志 已处理,OPTARG设置为'file1'答案 1 :(得分:0)
使用var ws = new WebSocket(myUri);
ws.onopen = function (evt) {
$this._handler.onSocketOpen(evt);
};
ws.onclose = function (evt) {
$this._handler.onSocketClose(evt);
};
ws.onmessage = function (evt) {
$this._handler.onSocketMessage(evt);
};
ws.onerror = function (evt) {
$this._handler.onSocketError(evt);
};
;&
请参阅case c in
c)
echo got c
;&
c|e)
echo got c or e
;;
esac
如果使用
man ksh
代替;&
,则执行下一个后续列表(如果有)。