Search code examples
zshparameter-expansion

Parameter Expansion in Zsh vs Bash: what is the equivalent of "${VAR,,}"?


I am trying to perform case modification with bash/zsh parameter expansion on macOS (11.4) and making some mistakes. Specifically, I want to take a variable that contains a string and turn it to snakecase (i.e.: from This is a STRING to this_is_a_string). I am taking baby steps and so far I am just trying to turn everything to lowercase and, as far as I understand it, the theory should work like this:

$ VAR="StRING"
$ echo "${VAR,,}" # turn the string characters to lowercase
string

This did not work at first, because macOS bash is the very much outdated 3.2.57. I installed the current version (5.1.8) with homebrew and it worked.

Still, this does not work with zsh (most recent version). I guess this happens because parameter expansion is different in zsh, am I right? Still, I cannot find any resourceful reference. I believe that zsh works a bit differently, more like sed. Sure, I could use tr and even sed itself, but I wanted to use parameter expansion.


Solution

  • In Zsh, you can use expansion modifiers:

    echo ${VAR:l}
    ## => string
    

    To turn the string to upper case, you can use

    echo ${VAR:u}
    ## => STRING
    

    See an online Zsh demo.

    Or, you may use expansion flags:

    echo ${(L)VAR}
    ## => string
    echo ${(U)VAR}
    ## => STRING