将数组类型变量转换为带有空格分隔符的字符串类型

将数组类型变量转换为带有空格分隔符的字符串类型

如果我有一个像这样的数组

arr[0]=2019-06-26
arr[1]=15:21:54

我怎样才能将其转换为一个值为

'2019-06-26 15:21:54'

答案1

如果 IFS 变量的第一个字符是空格(默认情况下),则可以在双引号中使用星号索引。

#! /bin/bash
arr[0]=2019-06-26
arr[1]=15:21:54

string="${arr[*]}"
printf "'%s'" "$string"

记录在下特殊参数:

当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。

答案2

为了完整起见,虽然"${array[*]}"Korn 语法(从 Bourne"$*"特殊参数扩展)也可以在 zsh 中使用,但在 zsh 中,您可能需要使用j(加入)参数扩展标志,它允许您使用任意连接字符串,并且不需要依赖全局参数,例如$IFS

$ a=(foo bar)
$ echo ${(j[:::])a}
foo:::bar

请注意,对于"${a[*]}", ksh(ksh93 和 mksh)加入第一个字节of$IFS而不是第一个字符。这对于多字节字符很重要,例如:

$ ksh -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo�bar
$ mksh -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo�bar
$ mksh -o utf8-mode -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo�bar

(这就是我的终端模拟器渲染该字符的第一个字节(0xe2)的方式,该字符本身并不形成有效字符)。

其他具有数组支持的类似 Korn 的 shell 也可以:

$ bash -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo⇅bar
$ zsh -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo⇅bar
$ yash -c 'a=(foo bar); IFS="⇅"; echo "${a[*]}"'
foo⇅bar

相关内容