Bash参数替换和扩展一气呵成

时间:2016-09-28 22:34:17

标签: bash

表达式是

a=(asd fgh ijk); b=${a[@]:1:${#a[@]}^};

以某种方式写在bash中?

我希望它能在第一个单词之后将每个单词的第一个字母大写。

(我知道如何在多个表达式中执行此操作,但我想知道如何通过组合这两个功能(扩展和替换)来实现它,如果可能的话......)

3 个答案:

答案 0 :(得分:3)

如果第一个元素是唯一一个以该字符开头的方法,那就有办法:

$ a=(asd fgh ijk)
$ echo "${a[@]^[!${a:0:1}]}"
asd Fgh Ijk

这将提取第一个元素的第一个字符,然后将该字符排除在大写字母之外; [!${a:0:1}]展开为[!a],仅与fi匹配,作为其元素的第一个字符。

如果多个元素以相同的字符开头,则会失败:

$ 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
相关问题