我设置了一个环境变量,想在调用命令时使用它,但没有骰子。
没有变量的完整命令有效:
nacho@WouldntYouLikeToKnow ~ % ls -la ~/Downloads
total 8675309
drwx------+ 16 nacho staff 512 Sep 28 10:30 .
drwxr-x---+ 29 nacho staff 928 Sep 29 10:39 ..
现在我设置了一个变量并尝试使用它,但它失败了:
nacho@WouldntYouLikeToKnow ~ % export testing="-la ~/Downloads"
nacho@WouldntYouLikeToKnow ~ % ls $testing
ls: invalid option --
usage: ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]
将几个单独的字符串(参数)填充到一个字符串中几乎总是错误的方法,至少如果您需要再次提取这些单独的字符串。
您正在执行的操作在
bash
shell 中有效(假设您使用$HOME
了~
,因为 shell 不会在双引号内进行波浪号扩展),因为它会将未加引号的变量扩展拆分为字符串中的空格字符(在$IFS
;中的任何字符上)也将文件名通配应用于生成的单词),而zsh
shell 不这样做。请注意,它仅适用于您的字符串
bash
中没有其他空格、制表符或换行符,并且该字符串也不包含文件名通配符。例如,如果路径名中有空格,或者如果您想bash
列出名为*
.在两个 shell 的变量中存储单独的命令行参数的正确方法是使用数组:
或者
在
bash
外壳中,您将使用它作为在这里,
"${args[@]}"
展开为由数组元素组成的列表args
,每个元素都单独引用。在
zsh
shell 中,你可以做同样的事情或者只是使用在这里,
zsh
shell 会将数组扩展args
为单独的元素,每个元素都变成 的参数ls
,但它不会(默认情况下)拆分这些元素或对它们应用文件名通配符。这些示例还保留波浪号不加引号,允许 shell 将其扩展为用户主目录的路径名。这种扩展会在分配给
args
数组时发生,而不是在使用值时发生。有关的: