Bash

bash:將數組轉換為保留空格的字元串

  • December 7, 2018

我只是想將數組轉換為字元串,同時保留空格。這就是我所擁有的:

INPUT=$1
readarray -t arr < <(grep -o . <<< "$INPUT")

echo "${arr[*]}"

我試過了${parameter//pat/string},將 IFS 設置為IFS=' '它顯然是錯誤的。我無法產生所需的輸出。

printf %q "$IFS"輸出$' \t\n'

我用命令執行我的腳本./rev_arr "I'm Hungry!"

輸出:

預期輸出:在此處輸入圖像描述

雖然我不太明白將字元串作為單獨字元讀取到數組中的用處,但只是為了再次重新形成字元串,設置IFS為單個空格將在使用時在數組元素之間插入一個空格"${arr[*]}"。相反,設置IFS為空字元串:

readarray -t arr < <( grep -o . <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )

我正在使用一個子shell來分配IFSprintfas 不改變IFS腳本其餘部分的值。

*in的使用"${arr[*]}"是將 IFS 中的第一個字元作為數組中每個元素的分隔符。您可以嘗試更改 IFS:

readarray -t arr < <(grep -o . <<< "$input")
( IFS=''; echo "${arr[*]}" )

或者嘗試使用 eval 進行複雜的評估延遲:

readarray -t arr < <(grep -o . <<< "$input")
IFS='' eval 'echo "array= ${arr[*]}"'

但是,當您只需要一個簡單的 printf 時,沒有真正需要啟動子 shell(以避免更改目前 shell 中的 IFS)或增加 eval 的風險:

readarray -t arr < <(grep -o . <<< "$input")
printf '%s' "${arr[@]}" $'\n'

請注意,使用 grep 將從$input.

為了能夠在數組元素中獲取換行符(對於小輸入):

[[ $input =~ ${input//?/(.)} ]] && arr=("${BASH_REMATCH[@]:1}")
printf '%s' array= "${arr[@]}" $'\n'

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