Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在KSH中计算参数中的空格?_Unix_Ksh - Fatal编程技术网

Unix 在KSH中计算参数中的空格?

Unix 在KSH中计算参数中的空格?,unix,ksh,Unix,Ksh,我试图允许将包含空格的字符串作为整个字符串计算,而不是进行解析。这就是我希望发生的事情: $ ksh program.ksh "what up" File 'what up' not found. 这就是我得到的: $ ksh program.ksh "what up" File 'what' not found. File 'up' not found. 这是我试图使之生效的代码: wflag=false cflag=false while getopts "cw" opt; do

我试图允许将包含空格的字符串作为整个字符串计算,而不是进行解析。这就是我希望发生的事情:

$ ksh program.ksh "what up"
File 'what up' not found.
这就是我得到的:

$ ksh program.ksh "what up"
File 'what' not found.
File 'up' not found.
这是我试图使之生效的代码:

wflag=false
cflag=false

while getopts "cw" opt; do
  case "$opt" in
    c)
      cflag=true
      ;;
    w)
      wflag=true
      ;;
    /?)
      ;;
  esac
done
问题在于1)我尝试上面的东西,比如
ksh program.ksh“what up”
,2)我尝试
ksh program.ksh“-w-c”
之类的东西。第二个最令人困惑,因为当我打印出
wflag
cflag
时,它们都是真的。这里不应该将
“-w-c”
视为字符串吗?看起来内核(在这里工作的是内核吗?)正在解析这个,尽管这正是我不想要的;我希望它被视为一个带空格的字符串。我已经通读了和((关于争论的文章,不让我发表)),并且认为我理解它。很明显,我肯定错过了什么,或者根本就没有真正理解它:P

我的直觉告诉我,
getopts
会自动清除任何空白。我尝试了
$(opt)
,而不是
“$opt”
,还尝试了大括号和/或单引号(我很确定单引号是行不通的)。唉,没有雪茄


如果您有任何帮助,我们将不胜感激,并感谢您阅读本文。

您的
案例中的最后一项应该有反斜杠,而不是斜杠。为了便于诊断,让我们做一些其他更改,以便您可以看到发生了什么

#!/bin/ksh
wflag=false
cflag=false

# the first colon means suppress error messages
# the colon after the x means that -x requires an argument
while getopts ":cwx:" opt
do
    echo "opt $opt"
    case "$opt" in
        c)
            cflag=true
            ;;
        w)
            wflag=true
            ;;
        x)
            echo "x is an option, $OPTARG is its argument"
            ;;
        \?)
            echo "invalid option"
            ;;
        *)
            echo "missing argument"
            ;;
    esac
done
echo "cflag $cflag"
echo "wflag $wflag"
现在让我们用几种方式来称呼它:

$ ./script.ksh -c
opt [c]
cflag true
wflag false
好的

也很好

$ ./getoptstest.ksh -cw
opt [c]
opt [w]
cflag true
wflag true
仍然很好,但我们的答案是有预兆的

$ ./getoptstest.ksh '-c -w'
opt [c]
opt [?]
invalid option
opt [?]
invalid option
opt [w]
cflag true
wflag true
现在我们有进展了。Korn shell
man
页面上说:

前导:in-optstring使getopts存储 OPTARG中的选项无效,并且要将vname设置为?为了 未知选项和to:当所需选项参数为未命中时—— 惯性导航与制导。否则,getopts将打印一条错误消息

从上一个示例之前的示例中可以看到,您可以像
-cw
中那样同时运行这些选项。当您传递像
'-c-w'
这样的选项时,
getopts
将其视为
-c
-space
-
-w
。因此,除了两个无效选项(
--
-space
)之外,它还可以同时看到
-c
-w
,这就是设置标志的原因。如果没有前导冒号(这是问题中原始脚本的发布方式),您应该会收到如下错误消息:

./script.ksh: - : unknown option
./script.ksh: --: unknown option
如果你仔细看,你会注意到信号灯的空间和额外的破折号

不幸的是,
man
页面没有讨论
getopts
处理单独传递或集中传递的参数的能力

我不确定我是否理解您的
ksh程序。ksh“what up”
示例是否有问题

使用这些选项和参数尝试我修改过的脚本,看看它的其余部分是如何工作的

./script.ksh -x
./script.ksh -x foo
./script.ksh -z
./script.ksh -c bar -w
最后一个问题很棘手。当找到一个不以破折号开头的参数并且前面的选项不接受该参数时,
getopts
将停止处理,其余参数保留在原位。您可以在
while
循环之后使用
shift$($OPTIND-1))
,然后您就可以以通常的方式访问其余的位置参数


不幸的是,shell内置的
getopts
不能处理像
--version
这样的长选项。外部实用程序
getopt
确实如此,但在使用它时可能会遇到一些问题。

感谢您提供了如此清晰而有用的回答。不幸的是,
getopts
不支持长选项,我想我可能必须找到另一种方法来实现这一点。我将尝试将所有参数存储到一个数组中,并一次处理一个参数。再次感谢你的帮助!如果您使用的是ksh93,它的
getopts
内置有允许长选项的扩展。@Alex:您应该知道@jilles评论说在ksh93中,
getopts
允许长选项。中没有提到它,但它在
getopts--man
中有文档记录。但是,
膨胀了
./script.ksh -x
./script.ksh -x foo
./script.ksh -z
./script.ksh -c bar -w