表达式是
a=(asd fgh ijk); b=${a[@]:1:${#a[@]}^};
以某种方式写在bash中?
我希望它能在第一个单词之后将每个单词的第一个字母大写。
(我知道如何在多个表达式中执行此操作,但我想知道如何通过组合这两个功能(扩展和替换)来实现它,如果可能的话......)
答案 0 :(得分:3)
如果第一个元素是唯一一个以该字符开头的方法,那就有办法:
$ a=(asd fgh ijk)
$ echo "${a[@]^[!${a:0:1}]}"
asd Fgh Ijk
这将提取第一个元素的第一个字符,然后将该字符排除在大写字母之外; [!${a:0:1}]
展开为[!a]
,仅与f
和i
匹配,作为其元素的第一个字符。
如果多个元素以相同的字符开头,则会失败:
$ a=(asd agh ijk)
$ echo "${a[@]^[!${a:0:1}]}"
asd agh Ijk
答案 1 :(得分:2)
标题大小写,然后切换第一个字符?
declare -c a
a=(asd agh ijk)
b="${a[0]~} ${a[@]:1}"
答案 2 :(得分:1)
不是双重替代,而是简短的解决方案:
为了利用shift
,我们可以使用位置参数而不是数组。
set -- asd fgh ijk;
b=$1; shift; printf '%s ' "$b" "${@^}"
定义一个函数:
$ cc(){ local b=$1; shift; printf '%s ' "$b" "${@^}"; }
$ cc asd fgh ijk
asd Fgh Ijk
如果您需要将这些字词作为一个长字符串,请将'%s '
替换为'%s'
:
$ cc(){ local b=$1; shift; printf '%s' "$b" "${@^}"; }
$ cc asd fgh ijk
asdFghIjk