Bash

使用空格分隔符將數組類型變數轉換為字元串類型

  • June 28, 2019

如果我有一個像

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

我怎樣才能將它轉換成一個字元串,其值為

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

如果 IFS 變數的第一個字元是空格(預設情況下是空格),您可以使用雙引號中的星號索引。

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

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

記錄在特殊參數下:

當擴展出現在雙引號內時,它會擴展為一個單詞,每個參數的值由 IFS 特殊變數的第一個字元分隔。

為了完整起見,雖然"${array[*]}"Korn 語法(從 Bourne"$*"特殊參數擴展而來)也適用於 zsh,但在 zsh 中,您可能希望使用j(for join ) 參數擴展標誌,它允許您使用任意連接字元串並且不會t 需要依賴全域參數,例如$IFS

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

請注意,對於"${a[*]}", ksh(ksh93 和 mksh)加入第一個字節$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-like 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

引用自:https://unix.stackexchange.com/questions/527411