UNIX - 多个交换机的getopts

时间:2017-10-13 16:54:59

标签: shell unix getopts

下面的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

2 个答案:

答案 0 :(得分:2)

基于您的示例脚本调用:

ksh -x test.sh -c -e file1 file2
  • '-c'选项有参数
  • '-e'选项确实有一个参数(即'file1')

如果是这种情况,请尝试删除:选项字符串中字母“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'
  • 因为'c'选项/标志后面跟冒号(c :),' - e'被视为'-c'选项的参数;因为'-e'在getopts ...
  • 的传递中消耗了
  • 没有其他选项标记可供处理,因此永远不会访问“e”选项的getopts个案
$ 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时,' - ''选项/标志 已处理,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代替;&,则执行下一个后续列表(如果有)。