【问题标题】:zsh substituion - what's the difference between $VAR and ${VAR}?zsh 替换 - $VAR 和 ${VAR} 有什么区别?
【发布时间】:2021-01-28 13:30:58
【问题描述】:

我最近将一个 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 的文件,这真是出乎意料。为什么这种细微的变化会产生如此大的影响?

【问题讨论】:

  • $HOST = User@1.1.1.1 在 bash 中也不起作用。见Command not found in bash variable assignment
  • 实际路径是什么? : 可能被误解为词修饰符,因为 $HOST:s 等效于 ${HOST:s} 而不是 ${HOST}:s
  • 这是我的转录错误。我将问题更新为正确的语法。
  • @chepner 路径是$HOST:stage\\something,所以完整路径确实包含$HOST:s

标签: shell zsh


【解决方案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

【讨论】:

  • 这并没有解决所提出的问题。您可以假设发布的作业不是 OP 实际运行的,因为它在 bash 中不起作用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多