web-dev-qa-db-ja.com

複数のテキストソースの最初の行から配列を作成するにはどうすればよいですか?

それぞれ数行のテキストを持つファイルへのパスの配列があります。次のように処理された各ファイルの最初の行が入力された配列を作成したいと思います。

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

せいぜい、配列で取得した値は1つだけです。 forループから探している配列を取得できないようです。私は多くのバリエーションを試しましたが、どこが間違っているのかを理解するのに苦労しました。

8
dimmech

あなたが欲しかった

_lines+=("$line")
_

_+=Word_ 文字列の連結 (または加算)。 A 複合代入+=(...)は、値を配列に追加します。

おそらく、ここですべての変数展開を引用することもできます。lineには、行に空白が含まれている可能性がある場合は必ず必要ですが、他の場所でも問題が発生する可能性があります。

11
Michael Homer

Bashでは、行を直接配列に読み込むこともできます。現在の配列の長さを選択した場合${#lines[@]}を挿入インデックスとして追加できます。

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

あらすじ抜粋

mapfile mapfile [-n count] [-O Origin] [-t] [array]

標準入力からインデックス付き配列変数array […]に行を読み込みます。オプションが指定されている場合、次の意味があります。

  • -n:最大count行をコピーします。 countが0の場合、すべての行がコピーされます。

  • -O:インデックスOriginarrayへの割り当てを開始します。デフォルトのインデックスは0です。

  • -t:読み取られた各行から末尾の改行を削除します。

4
David Foerster