当字符串可能是 -e、-E 或 -n 时,如何将 Bash 中的字符串转换为小写?

How to convert a string to lower case in Bash, when the string is potentially -e, -E or -n?

本题中:How to convert a string to lower case in Bash?

接受的答案是:

tr:

echo "$a" | tr '[:upper:]' '[:lower:]'

awk:

echo "$a" | awk '{print tolower([=12=])}'

如果 $a 是 -e 或 -E 或 -n,这些解决方案都不起作用

这是否是更合适的解决方案:

echo "@$a" | sed 's/^@//' | tr '[:upper:]' '[:lower:]'

使用

printf '%s\n' "$a" | tr '[:upper:]' '[:lower:]'

不用理会 tr。由于您使用的是 bash,只需在参数扩展中使用 , 运算符:

$ a='-e BAR'
$ printf "%s\n" "${a,,?}"
-e bar

使用typeset(或declare)可以定义一个变量,在赋值给变量时自动将数据转换为小写,例如:

$ a='-E'
$ printf "%s\n" "${a}"
-E

$ typeset -l a                 # change attribute of variable 'a' to automatically convert assigned data to lowercase
$ printf "%s\n" "${a}"         # lowercase doesn't apply to already assigned data
-E

$ a='-E'                       # but for new assignments to variable 'a'
$ printf "%s\n" "${a}"         # we can see that the data is 
-e                             # converted to lowercase

如果您需要保持当前变量的大小写敏感性,您总是可以定义一个新变量来保存小写值,例如:

$ typeset -l lower_a
$ lower_a="${a}"               # convert data to lowercase upon assignment to variable 'lower_a'
$ printf "%s\n" "${lower_a}"
-e