如何在zsh中的变量中调用带有空格的脚本?

est*_*ani 1 command-line zsh

这在 bash 中按预期工作:

> t="ls -l"
> $t #== ls -l
> "$t" #== "ls -l"
ls -l: command not found
Run Code Online (Sandbox Code Playgroud)

但是在 zsh 中我得到了这个:

> t="ls -l"
> $t #== "ls -l"
ls -l: command not found
Run Code Online (Sandbox Code Playgroud)

如何强制 shell 像 bash 一样再次解析变量值?

Sté*_*las 6

如果您想要一个扩展为多个参数的变量,请使用数组:

var=(ls -l)
$var
Run Code Online (Sandbox Code Playgroud)

但是要存储代码,最明显的存储类型是函数:

myfunction() ls -l
Run Code Online (Sandbox Code Playgroud)

或者:

myfunction() ls -l "$@"
Run Code Online (Sandbox Code Playgroud)

为该函数将额外的参数传递给ls.

bash与大多数其他类似 Bourne 的 shell 一样,在扩展时拆分未加引号的变量这一事实是 IMO 的一个错误。看看它会导致什么样的问题。但是如果你想要这种行为,你可以设置shwordsplit选项。您还可以添加globsubst选项来恢复在其他类似 Bourne 的 shell 中发现的另一个错误bash其中变量扩展也受到通配(又名路径名扩展)的影响。或做充分的家当有emulate shemulate ksh(但失去了几更多的zsh功能)。

无需去那里,您还可以告诉zsh显式拆分变量:

var='ls -l'
$=var # split on $IFS like the $var of bash/sh
${(s: :)var} # split on spaces only regardless of the value of $IFS
Run Code Online (Sandbox Code Playgroud)
var='*.txt'
echo $~var # do pathname expansion like the $var of bash/sh
Run Code Online (Sandbox Code Playgroud)
var='ls -l *.txt'
$=~var # do both word splitting and filename generation
Run Code Online (Sandbox Code Playgroud)

  • `$*`/`"$*"`/`$@`/`"$@"/`$1`` 是`$argv[*]`、`"$argv[*]"`、` $argv[@]`、`"$argv[@]"`、`$argv[1]` 都是不同的。与 ksh/bash 的主要区别再次在于,在未加引号的情况下,分词和通配符不会在此基础上进行(这对于数组更没有意义)。 (2认同)