"${var,,}" 中的逗号是什么意思?

Hit*_*nia 11 bash

read -p "Enter yes/no   " SOMEVAR

SOMEVAR=`"echo ${SOMEVAR,,}"`
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我一个${SOMEVAR,,}: bad substitution错误。

Kus*_*nda 18

参数扩展${variable,,}将扩展到shell 中$variable所有字符为小写的值bash。鉴于您在此代码运行时收到“错误替换”错误表明您实际上是

  • 不使用该外壳,但可能/bin/sh(并非总是如此bash)。但是没有收到错误read -p提示您更有可能是
  • 使用bash不支持此扩展的旧版本(在 的第 4 版中引入bash)。

扩展的通用形式是匹配中的${variable,,pattern}所有字符都将转换为小写(用于转换为大写):$variablepattern^^

$ str="HELLO"
$ printf '%s\n' "${str,,[HEO]}"
heLLo
Run Code Online (Sandbox Code Playgroud)

另请参阅bash系统手册。


对于旧版本的bash,您可以改为执行以下操作来小写变量的值:

variable=$( tr 'A-Z' 'a-z' <<<"$variable" )
Run Code Online (Sandbox Code Playgroud)

这通过tr使用“here-string”传递变量的值。该tr实用程序音译中的所有字符AZASCII范围(假设C / POSIX区域),以在相应的字符az范围。


还要注意的是

SOMEVAR=`"echo ${SOMEVAR,,}"`
Run Code Online (Sandbox Code Playgroud)

最好写成

SOMEVAR=${SOMEVAR,,}
Run Code Online (Sandbox Code Playgroud)

事实上,您编写的内容会在bash4+ 版本中给您一个“找不到命令”的错误,除非您有一个名为 的命令echo string,包括空格(string用户输入的内容在哪里)。这是由于命令替换试图执行双引号字符串。

  • 或者他们有 4.0 之前的 Bash(比如 Mac 上的 3.2) (5认同)
  • @HitanshuSachania 如果他们真的有 bash 版本 3.2,那么他们可能正在使用 Ubuntu 8.04,因为[那是最后一个](http://old-releases.ubuntu.com/releases/hardy/ubuntu-8.04-dvd- amd64.list) 附带 3.2 bash。那已经快11岁了!使用过时的软件会带来巨大的安全风险。事实上,bash 本身存在 [一个巨大的错误](https://unix.stackexchange.com/q/157381/22222)。这应该是说服他们升级的好方法,尽管任何允许这种情况发生的系统管理员都比错误本身具有更大的安全风险。 (2认同)