zsh 替换 - $VAR 和 ${VAR} 有什么区别?

zsh substituion - what's the difference between $VAR and ${VAR}?

我最近将一个 shell 脚本从 bash 转换为 zsh 并得到了一个奇怪的错误。我有一个像

这样的命令
HOST="User@1.1.1.1"
scp "$BASE_DIR/path/to/file" $HOST:some\path

这在 bash 中运行良好,但 zsh 因替换错误而失败。我通过将 $HOST 更改为 ${HOST} 来修复此问题,但我很好奇为什么这是必要的。另外,奇怪的是,我有几个这样的 scp 命令,除了第一个之外,所有这些命令都“有效”。但是,我最终在我的文件系统上得到了一个名为 User@1.1.1.1 的文件,这真是出乎意料。为什么这种细微的变化会产生如此大的不同?

两个可能的问题 (1) 赋值开头的额外“$”,以及 (2) 嵌入空格。

第一个潜在的问题是 $var=foo 风格的赋值。在 zsh 中,就像在其他类似 sh 的引擎(ksh,bash,...)中一样,赋值操作是 VAR=value - no $.

第二个潜在问题是空格。变量名称、“=”和值之间不允许有空格。值中的空格必须转义(使用引号或反斜杠) 潜在修正:

HOST=User@1.1.1.1
scp "$BASE_DIR/path/to/file" $HOST:some\path

正如 chepner 在评论中提到的,zsh 具有通过 : 添加的修饰符。所以 $HOST:some 被 zsh 解释为 $HOST:s.

可在此处找到修饰符列表:https://web.cs.elte.hu/local/texinfo/zsh/zsh_23.html