如何用 zsh 回显文字变量值

how to echo literal variable value with zsh

我有一个简单的 shell 函数可以将 *nix 风格的路径转换为 ​​Windows 风格(我碰巧使用 Windows 子系统来实现 Linux)。

# convert "/mnt/c/Users/josh" to "C:\Users\josh"
function winpath(){
  enteredPath=

  newPath="${enteredPath/\/mnt\/c/C:}" # replace /mount/c/ with C:
  newPath="${newPath//\//\}"          # replace / with \

  echo $newPath
}

期望的行为是:

$ winpath /mnt/c/Users/josh
C:\Users\josh

这在 bash 中工作正常,但在 zsh 中,echo 似乎对 $newPath 值做了一些额外的插值。它的行为是这样的:

$ winpath /mnt/c/Users/josh
C:sers\josh

echo 内插的字符序列是什么,为什么要删除 \U?最重要的是,我如何 return 文字值?

我试过深入研究 zsh 文档,但它是一片丛林。提前致谢!

zsh 处理 bash 默认情况下不处理的某些转义序列。 \U 引入了 4 字节 Unicode 代码点,但由于以下 8 个字符不是有效的十六进制数,因此不会替换任何字符。

我建议使用 printf,因为它的行为在 shell 到 shell 之间更容易预测。

printf '%s\n' "$newPath"

问题是您使用的是内部命令 echo,而不是外部命令。如果你会写

command echo $newPath

你会得到预期的输出。 command强制zsh根据当前PATH查找命令字,忽略内部命令、别名或同名函数