文字列が与えられたら、各フィールドを配列要素にfoo
保存したいと思います。私は以前のバージョンのbashと互換性のあるコマンドや他のコマンドを使ってこれをしたかったのですが、そうではありませんでした。\n
bar
read
readarray
私は次のコマンドを試しました。
IFS=$'\n' read -d '' -r -a bar <<< "$foo"
ただし、エラーコード1のみが返されます。
私が望むことを達成するために使用できるコマンドはありますか?これを繰り返し実行できることはわかっていますが、1つのコマンドで行うことをお勧めします。
答え1
read
文字列に区切り文字がないため、1を返します。しかし、配列は埋められます。
$ echo "$BASH_VERSION"
3.2.57(1)-release
$ foo=$'one\ntwo\nthree\nfour'
$ IFS=$'\n' read -d '' -r -a bar <<<"$foo"
$ echo $?
1
$ declare -p bar
declare -a bar='([0]="one" [1]="two" [2]="three" [3]="four")'
空でない区切り文字を使用すると、ゼロ以外の結果が生成されます。
$ unset bar
$ IFS=$'\n' read -d "\034" -r -a bar <<<"${foo}\034"
$ echo $?
0
$ declare -p bar
declare -a bar='([0]="one" [1]="two" [2]="three" [3]="four")'
8進数34はASCII「ファイル区切り記号」文字です。できないあなたのデータに表示されます。
答え2
@glenn jackmanの最初の解決策のわずかに短いバリエーション:与えられた
foo=$'one\ntwo\nthree\nfour'
、Bashができるようにしておきます。みんな働く:
set -o noglob # See special Note, below.
IFS=$'\n' bar=($foo)
set +o noglob # See special Note, below.
括弧は、要素が括弧の内容である配列を初期化していることをBashに伝えます。それはすべてです。
追加するには編集してください。 メモ:
*
入力行に?
(またはman 7 glob
リスト全体を含む)などのワイルドカードメタ文字を含めることができる場合は、一時的に無効にしてファイル名の拡張を防ぐ必要がありますnoglob
。ゴードンデイビソン!
有効であることが確認済み:
echo ${#bar[@]}
4
と
echo "[0]:'${bar[0]}' ... [3]:'${bar[3]}'"
[0]:'one' ... [3]:'four'
echo "$BASH_VERSION"
4.1.2(2)-release