だから私はwhiptail
コマンドを使ってユーザーにシステムにインストールしたいさまざまな項目を選択するオプションを提供したいと思います。whiptail --checklist
次のコマンドを使用します。
name =$(whiptail --title "Tools to install" --checklist 20 78 4 \
"NTP" "NTP setup" OFF\
"Perl" "Perl install" OFF\
"Ruby" "Ruby install" OFF \
"Python" "Python install" OFF 3>&1 1>&2 2>&3)
ユーザーがPerlとPythonを選択すると、「Perl」と「Python」が出力されます。私が探しているのは、最終的にこの配列を繰り返す必要があるため、これらの出力を配列に変換できることです。使用している次のコマンドへの入力として、これらの出力が必要です。
どんな助けやリーダーシップでも大いに感謝します!
答え1
簡単な場合は、次のようにできます。
CHOICES=( $(whiptail --title "Tools to install" \
--checklist "Choose something" 20 78 4 \
"NTP" "NTP setup" OFF \
"Perl" "Perl install" OFF \
"Ruby" "Ruby install" OFF \
"Python" "Python install" OFF 3>&1 1>&2 2>&3) )
ただし、返された値がwhiptail
引用されているため動作しません。たとえば、次のスクリプトは次のようになります。
CHOICES=( $(whiptail --title "Tools to install" \
--checklist "Choose something" 20 78 4 \
"NTP" "NTP setup" OFF \
"Perl" "Perl install" OFF \
"Ruby" "Ruby install" OFF \
"Python" "Python install" OFF 3>&1 1>&2 2>&3) )
for choice in "${CHOICES[@]}"; do
echo "choice: $choice"
done
出力されます(RubyとPythonを選択した場合)。
choice: "Ruby"
choice: "Python"
いずれかの値にスペースが含まれていると、競合が発生します。たとえば、次のようにコマンドラインを変更した場合:
CHOICES=( $(whiptail --title "Tools to install" \
--checklist "Choose something" 20 78 4 \
"NTP Setup" "NTP setup" OFF \
"Perl install" "Perl install" OFF \
"Ruby" "Ruby install" OFF \
"Python Install" "Python install" OFF 3>&1 1>&2 2>&3) )
for choice in "${CHOICES[@]}"; do
echo "choice: $choice"
done
私達は次を得ました:
choice: "NTP
choice: Setup"
choice: "Perl
choice: install"
上記の2つの問題を解決するために1つを追加できますeval
。
eval CHOICES=( $(whiptail --title "Tools to install" \
--checklist "Choose something" 20 78 4 \
"NTP Setup" "NTP setup" OFF \
"Perl install" "Perl install" OFF \
"Ruby" "Ruby install" OFF \
"Python Install" "Python install" OFF 3>&1 1>&2 2>&3) )
for choice in "${CHOICES[@]}"; do
echo "choice: $choice"
done
前の例と同じ選択をすると、次のように出力されます。
choice: NTP Setup
choice: Perl install