我一直在尝试bash内部大小写转换,发现我认为不一致的地方。
我定义一个值为“ aBcDeF”的变量,然后尝试将[A-D]范围内的第一个大写字符转换为小写。我期望得到“ abcDeF”的结果,但我得到:
$ lowerFirst=aBcDeF
$ echo ${lowerFirst,[A-D]}
aBcDeF
它似乎与小写字母“ a”匹配,因为它已经是小写字母了,因此得出结论。
${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)
我正确解释了吗?如果没有,我怎么了?
答案 0 :(得分:2)
bash手册指出:
^^
和,,
扩展会转换扩展值中的每个匹配字符;^
和,
扩展名匹配并转换仅扩展名中的第一个字符。
,
将匹配模式的第一个字符转换为小写。 ,,
将转换所有匹配的字符。无法仅转换第一个匹配字符。