Bash和^^大小写转换不匹配模式

时间:2019-02-17 02:32:09

标签: bash case-conversion

我一直在尝试bash内部大小写转换,发现我认为不一致的地方。

我定义一个值为“ aBcDeF”的变量,然后尝试将[A-D]范围内的第一个大写字符转换为小写。我期望得到“ abcDeF”的结果,但我得到:

$ lowerFirst=aBcDeF
$ echo ${lowerFirst,[A-D]}
aBcDeF

它似乎与小写字母“ a”匹配,因为它已经是小写字母了,因此得出结论。

bash man page

${parameter,pattern}  
  

扩展模式以产生与文件名相同的模式   扩张。测试参数扩展值中的每个字符   针对模式,如果与模式匹配,则其大小写为   转换。该模式不应尝试匹配多个字符。

这使我研究了filename expansion上的这一节,这似乎很清楚,第一个大写字符应该有一个匹配项。

这让我想知道大小写转换,通常情况下,手册页似乎无法正常显示。

我的脚本:

lowerFirst=aBcDeF
upperFirst=AbCdEf

echo 'lowerFirst=aBcDeF'
echo 'upperFirst=AbCdEf'
echo
echo 'Original Converted    Expected    Conversion'
echo "${lowerFirst}   ${lowerFirst,[A-D]}       abcDeF      "'${lowerFirst,[A-D]}'
echo "${upperFirst}   ${upperFirst,[A-D]}       abCdEf      "'${upperFirst,[A-D]}'

echo "${lowerFirst}   ${lowerFirst,[a-d]}       aBcDeF      "'${lowerFirst,[a-d]}'
echo "${upperFirst}   ${upperFirst,[a-d]}       AbCdEf      "'${upperFirst,[a-d]}'

echo "${lowerFirst}   ${lowerFirst^[A-D]}       aBcDeF      "'${lowerFirst^[A-D]}'
echo "${upperFirst}   ${upperFirst^[A-D]}       AbCdEf      "'${upperFirst^[A-D]}'

echo "${lowerFirst}   ${lowerFirst^[a-d]}       abcDeF      "'${lowerFirst^[a-d]}'
echo "${upperFirst}   ${upperFirst^[a-d]}       abCdEf      "'${upperFirst^[a-d]}'

echo
echo "${lowerFirst}   ${lowerFirst,,[A-D]}       abcdeF      "'${lowerFirst,,[A-D]}'
echo "${upperFirst}   ${upperFirst,,[A-D]}       abcdEf      "'${upperFirst,,[A-D]}'

echo "${lowerFirst}   ${lowerFirst,,[a-d]}       aBcDeF      "'${lowerFirst,,[a-d]}'
echo "${upperFirst}   ${upperFirst,,[a-d]}       AbCdEf      "'${upperFirst,,[a-d]}'

echo "${lowerFirst}   ${lowerFirst^^[A-D]}       aBcDeF      "'${lowerFirst^^[A-D]}'
echo "${upperFirst}   ${upperFirst^^[A-D]}       AbCdEf      "'${upperFirst^^[A-D]}'

echo "${lowerFirst}   ${lowerFirst^^[a-d]}       ABCDeF      "'${lowerFirst^^[a-d]}'
echo "${upperFirst}   ${upperFirst^^[a-d]}       ABCDEf      "'${upperFirst^^[a-d]}'

这给出了:

lowerFirst=aBcDeF
upperFirst=AbCdEf

Original Converted    Expected    Conversion
aBcDeF   aBcDeF       abcDeF      ${lowerFirst,[A-D]}
AbCdEf   abCdEf       abCdEf      ${upperFirst,[A-D]}
aBcDeF   aBcDeF       aBcDeF      ${lowerFirst,[a-d]}
AbCdEf   AbCdEf       AbCdEf      ${upperFirst,[a-d]}
aBcDeF   aBcDeF       aBcDeF      ${lowerFirst^[A-D]}
AbCdEf   AbCdEf       AbCdEf      ${upperFirst^[A-D]}
aBcDeF   ABcDeF       abcDeF      ${lowerFirst^[a-d]}
AbCdEf   AbCdEf       abCdEf      ${upperFirst^[a-d]}

aBcDeF   abcdeF       abcdeF      ${lowerFirst,,[A-D]}
AbCdEf   abcdEf       abcdEf      ${upperFirst,,[A-D]}
aBcDeF   aBcDeF       aBcDeF      ${lowerFirst,,[a-d]}
AbCdEf   AbCdEf       AbCdEf      ${upperFirst,,[a-d]}
aBcDeF   aBcDeF       aBcDeF      ${lowerFirst^^[A-D]}
AbCdEf   AbCdEf       AbCdEf      ${upperFirst^^[A-D]}
aBcDeF   ABCDeF       ABCDeF      ${lowerFirst^^[a-d]}
AbCdEf   ABCDEf       ABCDEf      ${upperFirst^^[a-d]}

如果我要求使用bash版本,则会得到:

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

我正确解释了吗?如果没有,我怎么了?

1 个答案:

答案 0 :(得分:2)

bash手册指出:

  

^^,,扩展会转换扩展值中的每个匹配字符; ^,扩展名匹配并转换仅扩展名中的第一个字符

,将匹配模式的第一个字符转换为小写。 ,,将转换所有匹配的字符。无法仅转换第一个匹配字符。