Variables 在变量中解包字符串
在Bash中,我可以使用以下代码:Variables 在变量中解包字符串,variables,zsh,Variables,Zsh,在Bash中,我可以使用以下代码: [ "$sshcmd" = "" ] && sshcmd="ssh -someopts myhost" $sshcmd "echo hello world" 在ZSH中,相同的代码不起作用,因为它试图找到“ssh-someopts myhost”可执行文件。我如何在ZSH中做同样的事情 谢谢,Albert像其他shell一样,在空白处拆分字符串(更一般地说,在$IFS):$=sshcmd 但是您应该将sshcmd设置为一个数组,这样,如果其
[ "$sshcmd" = "" ] && sshcmd="ssh -someopts myhost"
$sshcmd "echo hello world"
在ZSH中,相同的代码不起作用,因为它试图找到“ssh-someopts myhost”可执行文件。我如何在ZSH中做同样的事情
谢谢,Albert像其他shell一样,在空白处拆分字符串(更一般地说,在
$IFS
):$=sshcmd
但是您应该将sshcmd
设置为一个数组,这样,如果其中一个选项包含空格,您的命令仍然有效:
sshcmd=(ssh -someopts myopts)
$sshcmd[@] "echo hello world"
顺便说一下,这也适用于bash和ksh;但是,您还必须保护数组变量替换,防止进一步拆分和文件名扩展:
sshcmd=(ssh -someopts myopts)
"${sshcmd[@]}" "echo hello world"
我是通过Bash的一个环境得到这个结果的,所以我认为数组不是一个选项(或者如何自动转换它?)。但是
$=sshcmd
有效,谢谢@Albert要像shell一样拆分某些内容,请使用${(z)sshcmd}
。它将处理sshcmd包含引用参数的情况:如果sshcmd包含字符串a'bcd'
,$=sshcmd
将其拆分为a
,'b
,c
,d'
,而${(z)sshcmd
将其拆分为a
,'bcd'
。它还处理$(…)
,“…”
,等等;请参阅man zshexpn中的参数扩展部分。谢谢@ZyX,这似乎更有用@阿尔伯特:如果在bash中使用$sshcmd
,那么zsh等价物是$=sshcmd
;在选项中不能有空格,因为空格是分隔符还是选项的一部分的信息已经丢失。如果在bash中使用eval$sshcmd
,那么zsh与${(z)sshcmd}
接近(但引用要求更为合理);尽管zsh与(仿真sh;eval$sshcmd)
更加兼容。请参见。@Dennis:我是第二种情况,但在我的情况下,用户通过参数或env变量将命令传递给脚本。如果他没有,脚本将使用一些默认值。我将如何解决这个问题?您可能需要使用下面答案(和评论)中的建议(与该链接中的信息一致)。但是,您应该知道,执行作为参数传递的命令可能会带来安全隐患。