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 shellman
页面上说:
前导: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