首页 > 解决方案 > 如何用 zsh 回显文字变量值

问题描述

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

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

  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?最重要的是,我如何返回文字值?

我试过挖掘 zsh 文档,但它是一片丛林。提前致谢!

标签: zsh

解决方案


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

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

printf '%s\n' "$newPath"

推荐阅读