web-dev-qa-db-ja.com

配列型変数をスペース区切り文字を使用して文字列型に変換します

私がのような配列を持っている場合

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

どうすればそれを値がである文字列に変換できますか

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

IFS変数の最初の文字がスペース(デフォルトではスペース)である場合は、スターインデックスを二重引用符で囲むことができます。

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

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

特別なパラメータの下に記載されています:

展開が二重引用符で囲まれている場合、各パラメーターの値がIFS特殊変数の最初の文字で区切られた単一のWordに展開されます。

7
choroba

完全を期すために、"${array[*]}" Korn構文(Bourne "$*"特殊パラメーターから拡張)もzshで機能しますが、zshではjを使用することをお勧めします(- join)代わりに、任意の結合文字列を使用でき、$IFSのようなグローバルパラメータに依存する必要がないパラメータ拡張フラグ。

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

"${a[*]}"の場合、ksh(ksh93とmkshの両方)は、最初の文字ではなく、$IFSの最初のbyteで結合することに注意してください。これは、次のようなマルチバイト文字にとって重要です。

$ 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のようなシェルはOKです:

$ 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
3