パイプで区切られたシェル変数の内容を配列変数への入力として渡す方法

パイプで区切られたシェル変数の内容を配列変数への入力として渡す方法

次の変数のデータを動的配列として扱う際に問題があります。

variable_1='A|B|C|D' -> dynamic_array=(A B C D)

sedコマンドを使用して '|'を空白に置き換え、データをDynamic_arrayに渡す方法を試しました。

1行のコードでこれを行う方法はありますか?

答え1

変更する必要はありませんIFSバッシュ4.4からスタート:

readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D

バラよりhelp readarray説明する。

注:以前の提案(readarray -td '|' arr <<< "$var")は短いですが、Freddyが指摘したように、最後の配列要素に偽の改行文字を挿入します。

答え2

仮定bash:


単語噴射を活用できます。内部フィールド区切り記号(IFS)のデフォルト値は、スペース、タブ、または改行です。ただし、環境変数を設定してそれをオーバーライドすることができ、その後IFS一般的な方法を使用して変数を作成できます。

set -f # disable filename expansion
IFS='|' arr=($variable_1)

またはdeclare:

IFS='|' declare -a 'arr=($variable_1)'

またはread:

IFS='|' read -ra arr  <<<  "$variable_1"

このような変数を変更する場合は、IFSまず別の変数に保存してからリセットする必要があります。

OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"

答え3

仮定的に、要素に含まれるすべての文字または非文字に適用されるパラメータ拡張フラグをzsh使用できます。s

$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )

空の文字列は空の要素(string=''gets array=( '' )、not array=( ))に分割されます。

関連情報