Bash
bash:將數組轉換為保留空格的字元串
我只是想將數組轉換為字元串,同時保留空格。這就是我所擁有的:
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來分配
IFS
和printf
as 不改變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'