Bashスクリプトループにパラメータを追加する

Bashスクリプトループにパラメータを追加する

使いたいwhiptail他のプログラムの出力に基づいてチェックボックスのリストを生成します。最初のプログラムでは、各出力行の最初の単語だけが必要なのでawk

Bashが配列をどのように処理するかを理解するには、私はtldpでこのリンクを使用しています。。配列のサイズを確認する方法を学びました。ここ

これは期待どおりに機能しませんが、echo出力をコピーしてwhiptail前に ""を入力すると機能します。

このコードが正しく機能するように変更するにはどうすればよいですか?

program.sh:

#! /bin/bash
find ./  -printf "%f\n"

mainscript.sh:

#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=" --checklist \"\" 15 40 5"
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
        MYPARAMS+=" \"${MYARRAY[$i]}\" \" \" off"
        i=$[$i+1]
done
whiptail $MYPARAMS
echo $MYPARAMS
exit

答え1

これは非常に理想的なソリューションではありませんが、次のものを使用できますeval

eval whiptail $MYPARAMS

問題が参照にあると思われます。しかし、MYPARAMSを配列に設定すると、期待どおりに機能します。

#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=( --checklist "" 15 40 5 )
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
        MYPARAMS+=( "${MYARRAY[$i]}" " " off )
        i=$[$i+1]
done
whiptail "${MYPARAMS[@]}"
echo "${MYPARAMS[@]}"
exit

答え2

MYPARAMS配列の代わりに文字列を作成するのはなぜですか?MYPARAMS同様の文字列なので、シェルコマンドラインは--checklist "" 15 40 5 "foo1" " " offパラメータ、(二重引用符で構成される文字列)、、、、、、、およびを使用whiptail $MYPARAMSして呼び出します。変数拡張を引用符で囲んでいない場合は、その値を各空白シーケンスのフィールドに分割し、結果フィールドをワイルドカードパターンとして扱い、ファイルと一致するとワイルドカードパターンを展開します。引用符はシェル構文の一部です。引用符はシェルパーサーによってのみ拡張され、変数拡張の一部としては拡張されません。whiptail--checklist""15405"foo1"""off

組み込み関数を使用してシェルパーサーを呼び出すことはできますが、eval正確に引用するのは困難です。これらの項目にシェル構文で自分自身を表さない文字が含まれている場合、これは特に困難です。

配列は文字列リストを保存する正しい方法です。MYARRAY使用するタグのリストを正常に設定したと仮定すると、配列を繰り返してパラメータ配列を作成できます。

MYPARAMS=()
for t in "${MYARRAY[@]}"; do
  MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"

関連情報