【问题标题】:Bash ,, and ^^ case conversion are not matching patternsBash , 和 ^^ 大小写转换不是匹配模式
【发布时间】:2019-07-10 19:03:34
【问题描述】:

我一直在尝试 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)

我的解释正确吗?如果没有,我哪里错了?

【问题讨论】:

    标签: bash case-conversion


    【解决方案1】:

    bash 手册指出:

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

    , 会将第一个字符转换为小写,如果它与模式匹配。 ,, 将转换所有匹配的字符。没有办法只转换第一个匹配的字符。

    【讨论】:

    • 我明白了。手册说“只有第一个字符”,而不是“只有第一个 匹配 字符”。我所有冗长的例子都与此一致。谢谢你的澄清。
    • 这是一个写得很糟糕的段落;我不怪你糊涂。第三句,“参数扩展值中的每个字符都根据模式进行测试”,应该改用我引用的后一句。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多