Bashで文字列変数の行を繰り返します。

Bashで文字列変数の行を繰り返します。

USBデバイスのリストを表示するために使用したいスクリプトがありますlsblk

注文する:

$ lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb

これにより

sdb   usb    Kingston DataTraveler 2.0
sdc   usb    Kingston DT 101 G2 

後で使用できるように結果を変数に保存したいので、次のように書き込みます。

$ usbs=$(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb)

私が期待するのは、変数がusbs上記のように2つの行全体に結果を格納することです。しかし、私が実行した場合:

for i in ${usbs[@]}; do
  echo $i
done

私が得た結果は単語に分けられます。

sdb
usb
Kingston
DataTraveler
2.0
sdc
usb
Kingston
DT
101
G2

質問:grepこのコマンドを使用してコマンドの結果を2つのライン全体に保存する方法はありますか?

結果をファイルにダンプしてから、読むよりも簡単な解決策があるかどうかを知りたいです。

ベストアンサー1

これは良いユースケースです配列/マップファイルの読み取り:

readarray -t usbs < <(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb)

これにより、各行が独自の要素に分割される出力配列が生成されます。

あなたの場合、次のような配列が作成されます。

usbs=(
'sdb   usb    Kingston DataTraveler 2.0'
'sdc   usb    Kingston DT 101 G2'
)

出力全体を配列の代わりに単一の変数に割り当てると、基本的に次の操作が行われます。

usbs='sdb   usb    Kingston DataTraveler 2.0
sdc   usb    Kingston DT 101 G2 '

配列にするには:

usbs=($(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb))

ただし、これにより、スペースで区切られた各単語は、次の独自の要素になります。

usbs=(
sdb
usb
Kingston
DataTraveler
2.0
sdc
usb
Kingston
DT
101
G2
)

多くのコメント作成者が指摘したように、通常は常にベストプラクティスであるため、変数を引用する必要があります。この場合、変数を引用し、通常は常に引用する必要があります。

まず、これは問題を解決する正しい方法ではないことをお伝えしたいと思います。それは「人を殺さないでください。さもなければ刑務所に行くでしょう」と言うのと少し似ています。

同様に、変数を引用するとセキュリティホールが生じるため、変数を引用しません。そうしないのが間違っているので、変数を引用しています(しかし、刑務所への恐怖が役に立つとしたらどうしますか)。

  • スティーブン・チャジェラス

場合はfor i in ${usbs[@]}; doそれぞれiに設定されます。言葉(スペースで区切られます) in usbs。この引用はそれぞれに設定されますfor i in "${usbs[@]}"; doi要素usbs、予想通り。

おすすめ記事