使いたい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
""
15
40
5
"foo1"
"
"
off
組み込み関数を使用してシェルパーサーを呼び出すことはできますが、eval
正確に引用するのは困難です。これらの項目にシェル構文で自分自身を表さない文字が含まれている場合、これは特に困難です。
配列は文字列リストを保存する正しい方法です。MYARRAY
使用するタグのリストを正常に設定したと仮定すると、配列を繰り返してパラメータ配列を作成できます。
MYPARAMS=()
for t in "${MYARRAY[@]}"; do
MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"