结合大小写更改和子字符串变量扩展

Combining case changing and substring variable expansion

如果将 ^ 附加到变量,Bash 会将其内容的第一个字母大写。 (类似地,, 将其发送为小写字母并将其中任何一个加倍将转换应用于整个字符串,而不仅仅是第一个字母。)

foo="hello world"
echo ${foo^}  # Hello world

你也可以${variable:position:length}提取一个子串:

echo ${foo:0:1}  # h

到目前为止,我还没有找到一种方法来组合这些,显然,创建一个临时变量。有没有一种形式可以让我从任意字符串中获取大写的首字母?

您可以将 tr 与子字符串一起使用:

tr [[:lower:]] [[:upper:]] <<< "${foo:0:1}"
H

它不会改变您所看到的无法 "chain" 扩展的基本限制,但您可以将扩展的结果分配给同一个变量并取消临时变量。

例如:

A=text
A="${A^}"
A="${A//x/s}"
echo "$A"

呼应 "Test".

没有。参数扩展运算符不组合,因此如果您想要多个副作用,则需要一个临时变量(可以包括覆盖原始值,如@fred 所示)或外部工具来处理扩展结果(如图所示通过@anubhava)。

您的另一种选择是使用不同的 shell 支持更复杂的操作,例如 zsh:

% foo="hello world"
% % print ${(U)${foo:0:1}}
H