그래서 저는 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"
위의 두 가지 문제를 해결하기 위해 하나를 추가할 수 있습니다 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