Bash参数一次替换和扩展

Bash参数一次替换和扩展,bash,Bash,一个表达式是什么 a=(asd fgh ijk); b=${a[@]:1:${#a[@]}^}; 可以在bash中写吗 我希望它将每个单词的第一个字母大写 (我知道如何在多个表达式中执行此操作,但我想知道如何通过组合两个功能(扩展和替换)来执行此操作,如果可能的话…不是双重替换,而是一个简短的解决方案: 为了利用shift,我们可以使用位置参数而不是数组 set -- asd fgh ijk; b=$1; shift; printf '%s ' "$b" "${@^}" 定义函数: $ c

一个表达式是什么

a=(asd fgh ijk); b=${a[@]:1:${#a[@]}^};
可以在bash中写吗

我希望它将每个单词的第一个字母大写


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

不是双重替换,而是一个简短的解决方案:

为了利用
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

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

$ 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

整个字符串的大小写,然后切换第一个字符

declare -c a
a=(asd agh ijk)
b="${a[0]~} ${a[@]:1}"

你的意思是:要获得asd Fgh Ijk?@sorontar。是的,但除此之外,我想跳过第一个单词(在同一个表达式中)。。有可能吗?哦,太糟糕了。。谢谢这几乎是我想要的(在“一次成功”中模拟降低驼峰案例)。不幸的是,您提到的异常无法解决。
declare-c
做什么?我找不到它的文档。@BenjaminW。另请参见
-l
-u
。这两个都有文档记录;)很漂亮,谢谢。也许
b=“${a~}${a[@]:1}”
就足够了?@sorontar只是因为在扩展数组元素时跳过索引默认为第一个元素-在我看来,添加索引可以让事情更清楚。@ASDFGHJKL是解决这个问题的新方法。很简单。