如果我有一个像这样的数组
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