参照変数で単語の区切りが発生します。

参照変数で単語の区切りが発生します。

lsblkコマンドの結果に基づいてダイアログメニューを作成しようとしています。私の目標は、最初の単語をメニュー項目として読み、残りの単語をメニュー項目の説明として読むことです。

たとえば、

$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,size | grep sda)

このコマンドは、ダイアログボックスの--menuオプションに各メニュー項目に2つのパラメータ(この場合は「name」と「size」)が必要なために機能します。

ただし、複数の単語で構成された説明を含む同じコマンドを使用しようとすると(「読み込み」組み込み関数を使用して2つの変数としてstdoutに書き込まれる)、参照されていても2番目の変数で単語の分離が発生します。

#commmand 1: unquoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name $desc
> done)                      #results in output like below without quotes

#command 2: quoted variable 
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name "$desc"
> done)                      #results in output like below without quotes

#command 3: escape quoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name \"$desc\"
> done)                      #results in output below

コマンド3出力

引用された変数で単語の区切りが発生する理由を理解できません。誰もが解決策を説明または提案できますか? lsblkの出力をファイルに書き込み、ファイルを読みましたが、同じ結果が得られました。希望の出力は次のとおりです。

希望の出力

編集:読みましたコマンドリファレンス考えられる解決策ですが、2つの引数が必要な場合は、lsblkコマンドの出力が1つの引数としてダイアログボックスに渡されます。

ありがとうございます。

ベストアンサー1

これは2つの部分に分けて行う必要があります。

# 1. read the output of lsblk, 2 words per line, into an array
parts=()
while read -r disk data; do 
    parts+=("$disk" "$data")
done < <(lsblk -lno name,type,size | grep sda)

# 2. send the elements of the array to the dialog command
dialog --menu "Choose one:" 0 0 0 "${parts[@]}"

このreadコマンドは、スペースで区切られたジョブの最初の部分をdisk変数に入れ、行の残りの部分を置きますdata。単語の分離を防ぐために、すべての変数を引用することが重要です。

おすすめ記事