Variables 在变量中解包字符串

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设置为一个数组,这样,如果其

在Bash中,我可以使用以下代码:

[ "$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变量将命令传递给脚本。如果他没有,脚本将使用一些默认值。我将如何解决这个问题?您可能需要使用下面答案(和评论)中的建议(与该链接中的信息一致)。但是,您应该知道,执行作为参数传递的命令可能会带来安全隐患。