Arrays 在Bash中使用数组粘贴单个字符串

Arrays 在Bash中使用数组粘贴单个字符串,arrays,string,bash,Arrays,String,Bash,下面的R函数的bash等价物是什么 vec=4:9 out=paste0("foo_",vec,"_bar") out "foo_4_bar" "foo_5_bar" "foo_6_bar" "foo_7_bar" "foo_8_bar" "foo_9_bar" 可以使用大括号展开: $ echo foo_{4..9}_bar foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar $ out=( foo_{4..9}_bar

下面的R函数的bash等价物是什么

vec=4:9
out=paste0("foo_",vec,"_bar")
out

"foo_4_bar" "foo_5_bar" "foo_6_bar" "foo_7_bar" "foo_8_bar" "foo_9_bar"

可以使用大括号展开:

$ echo foo_{4..9}_bar
foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar
$ out=( foo_{4..9}_bar )
$ echo "${out[1]}"
foo_5_bar
vec=( {4..9} ) # would work even with vec=( *.txt ) or readarray -t vec <file, etc.
out=( "${vec[@]/#/foo_}" ) # add foo_ prefix
out=( "${out[@]/%/_bar}" ) # add _bar suffix
declare -p out # print resulting array definition

可以使用大括号展开:

$ echo foo_{4..9}_bar
foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar
$ out=( foo_{4..9}_bar )
$ echo "${out[1]}"
foo_5_bar
vec=( {4..9} ) # would work even with vec=( *.txt ) or readarray -t vec <file, etc.
out=( "${vec[@]/#/foo_}" ) # add foo_ prefix
out=( "${out[@]/%/_bar}" ) # add _bar suffix
declare -p out # print resulting array definition

可以使用声明带有后缀和前缀的数组,然后使用大括号展开填充递增的数字:

arr=("foo_" "_bar") # array with suffix and prefix
echo "${arr[0]}"{4..9}"${arr[1]}" # brace expansion

foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar

可以使用声明带有后缀和前缀的数组,然后使用大括号展开填充递增的数字:

arr=("foo_" "_bar") # array with suffix and prefix
echo "${arr[0]}"{4..9}"${arr[1]}" # brace expansion

foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar

即使您的
vec
不是通过大括号展开生成的,也可以这样做:

$ echo foo_{4..9}_bar
foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar
$ out=( foo_{4..9}_bar )
$ echo "${out[1]}"
foo_5_bar
vec=( {4..9} ) # would work even with vec=( *.txt ) or readarray -t vec <file, etc.
out=( "${vec[@]/#/foo_}" ) # add foo_ prefix
out=( "${out[@]/%/_bar}" ) # add _bar suffix
declare -p out # print resulting array definition

vec=({4..9})#即使使用vec=(*.txt)或readarray-t vec也可以工作,即使您的
vec
不是通过大括号扩展生成的:

$ echo foo_{4..9}_bar
foo_4_bar foo_5_bar foo_6_bar foo_7_bar foo_8_bar foo_9_bar
$ out=( foo_{4..9}_bar )
$ echo "${out[1]}"
foo_5_bar
vec=( {4..9} ) # would work even with vec=( *.txt ) or readarray -t vec <file, etc.
out=( "${vec[@]/#/foo_}" ) # add foo_ prefix
out=( "${out[@]/%/_bar}" ) # add _bar suffix
declare -p out # print resulting array definition

vec=({4..9})#甚至可以与vec=(*.txt)或readarray-t vec-Hmm一起使用。我的意思是,这是有效的,但它只在非常特定的场景中(数组是通过大括号扩展生成的)才有效,而不适用于任何任意数组。@sjsam,…当数组与前缀和后缀连接在一起的元素时(用R术语来说,
4:9
)不是由常量定位的数字范围。请参阅问题评论中与OP的讨论,以这种方式限制问题域不是他们的意图。嗯。我的意思是,这是可行的,但它只适用于非常特定的场景(数组是通过大括号扩展生成的),而不适用于任何任意数组。@sjsam,…当前缀和后缀连接到元素的数组(用R表示,
4:9
)不是由常量锚定的数字范围时。请参阅问题评论中与OP的讨论,以这种方式限制问题域不是他们的意图。
vec=4:9
只是一个示例(输入可以是任何数组),还是真正的情况是它总是作为两个常量之间的范围生成?
echo foo{4..9}bar
,您需要在大括号展开前后结束引号。这与上面OP指定的“只是一个示例”相冲突,实际上他们希望能够为任何数组添加前缀和后缀,而不仅仅是一个以常量为界的数值范围的数组。(
{$start..$end}
由于大括号展开发生在参数展开之前,因此“以常量为界”)。@Remi.b,…也许使用一个像您希望的那样通用的函数定义可以减少混乱。是不是
vec=4:9
只是一个示例(输入可以是任何数组),或者它真的总是作为两个常量之间的一个范围生成吗?
echo foo{4..9}\u bar
?@twalberg,您希望在大括号展开之前和之后结束引号。这与“只是一个示例”相冲突“由上面的OP指定,大意是他们实际上希望能够向任何数组添加前缀和后缀,而不仅仅是一个以常量为界的数值范围。(
{$start..$end}
不起作用,因为大括号扩展发生在参数扩展之前,因此“以常量为界”)。@Remi.b,…也许使用一个通用的函数定义可以减少混淆。