Search code examples
zsh

how to echo literal variable value with zsh


I have a simple shell function to convert a *nix style path to Windows style (I happen to be using Windows Subsystem for Linux).

# 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
}

The desired behavior is:

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

This works correctly in bash, but in zsh, echo seems to do some extra interpolation of the $newPath value. It behaves like this:

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

What character sequence is echo interpolating and why is it remove the \U? Most importantly, how do I return the literal value?

I've tried digging through the zsh documentation, but it's a jungle. Thanks in advance!


Solution

  • zsh processes certain escape sequences that bash does not by default. \U introduces 4-byte Unicode codepoint, but since the following 8 characters are not a valid hexadecimal number, no character is substituted.

    I would recommend using printf, as its behavior is much more predictable from shell to shell.

    printf '%s\n' "$newPath"