2009-10-13 17 views
6

मुझे एक बहुत छोटा प्रोग्राम मिला है जो मुझे मेरे बैश स्क्रिप्ट्स में उपयोगकर्ता के अनुकूल जीयूआई जोड़ने की अनुमति देगा;बाश स्क्रिप्ट: whiptail फ़ाइल का चयन करें

whiptail

हालांकि whiptail man page कि सभी उपयोगी नहीं है और किसी भी उदाहरण प्रदान नहीं करता है। कुछ गूगल खोज करने के बाद मुझे समझ में एक सरल हाँ बनाने का तरीका/कोई whiptail का उपयोग कर मेनू:

#! /bin/bash 
# http://archives.seul.org/seul/project/Feb-1998/msg00069.html 
if (whiptail --title "PPP Configuration" --backtitle "Welcome to SEUL" --yesno " 
Do you want to configure your PPP connection?" 10 40) 
then 
     echo -e "\nWell, you better get busy!\n" 
elif (whiptail --title "PPP Configuration" --backtitle "Welcome to 
SEUL" --yesno "   Are you sure?" 7 40) 
     then 
       echo -e "\nGood, because I can't do that yet!\n" 
     else 
       echo -e "\nToo bad, I can't do that yet\n" 
fi 

लेकिन क्या मैं वास्तव में whiptail का उपयोग कर कुछ पुराने कोड मैं कुछ में है बदलने के लिए एक फ़ाइल चयन मेनू का निर्माण करना चाहते हैं विभिन्न बैकअप/बहाल बैश स्क्रिप्ट मेरे पास है:

#!/bin/bash 
#This script allows you to select a file ending in the .tgz extension (in the current directory) 
echo "Please Select the RESTORE FILE you would like to restore: " 
    select RESTOREFILE in *.tgz; do 
    break #Nothing 
    done 
echo "The Restore File you selected was: ${RESTOREFILE}" 

मुझे लगता है इस whiptail की '--menu' विकल्प के माध्यम से किया जा सकता है, लेकिन मुझे यकीन है कि इसके बारे में जाने के लिए कैसे नहीं हूँ? कोई पॉइंटर्स? या क्या आप मुझे कुछ whiptail उदाहरणों की दिशा में इंगित कर सकते हैं?

+0

मैंने अपने उत्तर (ऑक्टल रूपांतरण सूत्र) में एक छोटा सा परिवर्तन किया है। –

उत्तर

8

बिल्ड फ़ाइल नाम और मेनू का चयन टैग की एक सरणी:

i=0 
s=65 # decimal ASCII "A" 
for f in *.tgz 
do 
    # convert to octal then ASCII character for selection tag 
    files[i]=$(echo -en "\0$(($s/64 * 100 + $s % 64/8 * 10 + $s % 8))") 
    files[i+1]="$f" # save file name 
    ((i+=2)) 
    ((s++)) 
done 

इस तरह एक विधि भले ही रिक्त स्थान के साथ फ़ाइल नाम हैं काम करेंगे। यदि फ़ाइलों की संख्या बड़ी है, तो आपको एक और टैग रणनीति तैयार करनी पड़ सकती है।

टैग के लिए अल्फा वर्णों का उपयोग करके आप आइटम पर कूदने के लिए एक पत्र दबा सकते हैं। संख्यात्मक टैग ऐसा नहीं लगता है। यदि आपको उस व्यवहार की आवश्यकता नहीं है, तो आप कुछ जटिलता को खत्म कर सकते हैं।

प्रदर्शन मेनू:

whiptail --backtitle "Welcome to SEUL" --title "Restore Files" \ 
    --menu "Please select the file to restore" 14 40 6 "${files[@]}" 

बाहर निकलने के कोड 255 है, तो संवाद को रद्द कर दिया गया था।

if [[ $? == 255 ]] 
then 
    do cancel stuff 
fi 

एक चर में चयन पकड़ने के लिए, इस संरचना का उपयोग करें (के लिए "whiptail-कमांड" अपने whiptail आदेश स्थानापन्न):

result=$(whiptail-command 2>&1 >/dev/tty) 

या

result=$(whiptail-command 3>&2 2>&1 1>&3-) 

चर $result होगा वर्णमाला का एक अक्षर होता है जो सरणी में फ़ाइल से मेल खाता है। दुर्भाग्य से, संस्करण 4 से पहले बैश सहयोगी सरणी का समर्थन नहीं करता है।

((index = 2 * ($(printf "%d" "'$result") - 65) + 1)) 

उदाहरण::

Welcome to SEUL 
       ┌──────────┤ Restore Files ├───────────┐ 
       │ Please select the file to restore │ 
       │          │ 
       │   A one.tgz  ↑   │ 
       │   B two.tgz  ▮   │ 
       │   C three.tgz ▒   │ 
       │   D another.tgz ▒   │ 
       │   E more.tgz  ▒   │ 
       │   F sp ac es.tgz ↓   │ 
       │          │ 
       │          │ 
       │  <Ok>   <Cancel>  │ 
       │          │ 
       └──────────────────────────────────────┘ 
+0

कृपया ध्यान दें: मैंने पिछले ऑक्टल रूपांतरण सूत्र को प्रतिस्थापित करने के लिए अपना उत्तर संपादित किया है जो ( लगभग) पूरी तरह गलत है। –

+0

अस्थायी फ़ाइलों के लिए आप mktemp का उपयोग कर सकते हैं। उदाहरण के लिए, mytempfile=$(mktemp) ; echo "Hello world">$mytempfile; echo Contents of ${mytempfile}: $(cat $mytempfile) ; rm -f $mytempfile jbatista

+0

@jbatista: यह सच है, लेकिन यह कैसे लागू होता है? यहां अस्थायी फ़ाइलों का कोई उल्लेख नहीं है। –

3

व्हिप्टाइल का उपयोग करके dialog की सबसे लोकप्रिय सुविधाओं का हल्का पुन: कार्यान्वयन है। मैंने त्वरित जांच की, और व्हिप्टाइल में कई विशेषताएं संवाद में अपने समकक्षों की तरह व्यवहार करती प्रतीत होती हैं। तो, एक संवाद ट्यूटोरियल शुरू करना चाहिए। आप एक here पा सकते हैं लेकिन Google आपका मित्र है। दूसरी ओर, extended example में शायद आपकी समस्या के लिए बहुत प्रेरणा शामिल है।

0

मैं निम्नलिखित की कोशिश की है, जो काम किया:

whiptail --title "PPP Config" --backtitle "Welcome to SEUL" --menu YourTitle 20 80 10 `for x in $(ls -1 *.tgz); do echo $x "-"; done` 

आप के साथ-साथ एक बहु-लाइनर में इस बदल सकता है, मैं खाली सूची के लिए जाँच जोड़ दिया है:

MYLIST=`for x in $(ls -1 *.tgz); do echo $x "-"; done` 
WC=`echo $MYLIST | wc -l` 

if [[WC -ne 0]]; then 
    whiptail --title "PPP Config" --backtitle "Welcome to SEUL" --menu YourTitle 20 80 10 $MYLIST 
fi 

आप की जरूरत क्लीनइंटरफेस प्राप्त करने के लिए संख्याओं को समायोजित करने के लिए। और यदि आप चाहें तो "-" को किसी अन्य चीज़ से बदल सकते हैं। लेकिन यदि आप नहीं करते हैं, तो आप प्रति पंक्ति 2 प्रविष्टियां देखेंगे।

वैसे: चयनित प्रविष्टि stderr पर मुद्रित है।

इसे और अधिक सुधार करने की आवश्यकता हो सकती है, लेकिन बुनियादी विचार के लिए मुझे लगता है कि यह पर्याप्त है।

0

इस शीर्ष में से एक हो रहा है आप इस तरह पत्र से फ़ाइल की सरणी में सूचकांक ("अतिरिक्त" एकल उद्धरण नोटिस) की गणना कर सकते परिणाम जब आप whiptail की खोज करते हैं, और मेरे पिछले परिणामों में से कोई भी मेरे लिए काम नहीं करता है।

#! /bin/bash 
shopt -s nullglob 
dir=`pwd` 
cd /path/to/files 
arr=(*.tgz) 
for ((i=0; i<${#arr[@]}; i++)); do j=$((2*$i+2)); a[j]="${arr[$i]}"; a[j+1]=""; done 
a[0]="" 
# Next line has extra spaces at right to try to center it: 
a[1]="Please make a selection from the files below              " 
result=$(whiptail --ok-button "OK button text" --cancel-button "Cancel Button Text" --title "Title Text" --backtitle "Text at upper left corner of page" --menu "Menu Text (not used??)" 30 160 24 "${a[@]}" 2>&1 >/dev/tty) 
if [[ $? = 0 ]] 
then 
# ge 5 in next line should be length of file extension including . character, plus 1 
    [ ${#result} -ge 5 ] && outfile="/path/to/files/$result" || echo "Selection not made" 
fi 
cd "$dir" 

$ परिणाम खाली हो जाएगा यदि कोई भी मान्य चयन किया गया था: यह है कि मैं क्या उपयोग कर घाव है। मैंने सूची के शीर्ष पर एक डमी चयन जोड़ा जो परिणामस्वरूप एक खाली स्ट्रिंग देता है, ताकि आप गलती से गलती से गलत फ़ाइल का चयन कर सकें, मेनू के ठीक बाद एंटर दबाएं। यदि आप इसे नहीं चाहते हैं, तो "के लिए" लाइन में +2 को "= j = $ ((2 * $ i + 2)" में हटा दें और निम्न दो पंक्तियां जो [0] और एक सेट करें [1] स्पष्ट रूप से।

whiptail के बारे में भ्रामक बात यह है कि जब इस तरह की एक स्थिति में एक सरणी से पढ़ यह प्रत्येक पंक्ति में दो डेटा आइटम, प्रदर्शित किए जाते हैं जो दोनों के, आप जो पहला परिणाम लौटे चाहते हैं, तो लाइन की उम्मीद है जा रहा है उम्मीद है (जो कुछ परिस्थितियों में एक पत्र या संख्या हो सकती है) और दूसरा जो भी वर्णनात्मक पाठ हो सकता है वह हो सकता है। यही कारण है कि पहली पंक्ति के लिए मैं परिणाम के रूप में एक खाली स्ट्रिंग देने के लिए [0] का उपयोग करता हूं, और एक [1] वर्णनात्मक पाठ के रूप में, लेकिन जोड़ी में पहले आइटम पर फ़ाइल नाम होता है (जो वास्तव में मैं वास्तव में वापस लौटना चाहते हैं) और दूसरा एक खाली स्ट्रिंग है, क्योंकि मैं उन पंक्तियों पर फ़ाइल नाम के अलावा कोई भी टेक्स्ट प्रदर्शित नहीं करना चाहता हूं।

साथ ही पिछले पोस्ट whiptail 255 त्रुटि कोड यदि रद्द बटन दबाया गया था, लेकिन वह मेरे पास है संस्करण के लिए मामला नहीं था - यह रिटर्न 1. तो मैं बस 0 के एक त्रुटि कोड के लिए परीक्षण और अगर मुझे लगता है कि यह एक वैध प्रविष्टि हो सकती है, तो मैं सुनिश्चित करने के लिए एक वैध स्ट्रिंग लम्बाई (फ़ाइल एक्सटेंशन में वर्णों की संख्या से अधिक की संख्या के अलावा) की जांच करता हूं।

संबंधित मुद्दे