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
我最近将一个 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