نمایش کادرهای محاورهای در Bash - قسمت اول
یکی از کارهای خوب توی اسکریپت نویسی اینه که به کاربر دیالوگ نشون بدیم. این طوری کاربر با اسکریپت بیشتر ارتباط برقرار میکنه و راحتتر کارهاشو انجام میده. برای نشون دادن دیالوگ به کاربر میتونید از چندتا بسته استفاده کنید که از بین اونها کار با dialog از همه راحتتره. dialog کادرهای محاورهایه متنوعی مثل کادر پیغام، پرسش، تقویم و ... رو پشتیبانی میکنه. از طرفی حجم خیلی کمی داره و کار باهاش پیچیده نیست.
برای نصب dialog از دستورات زیر استفاده کنید:
Debian یا Ubuntu
# sudo apt-get install dialog
Redhat, CentOS یا Fedora
# yum install dialog
برای ساختن یه دیالوگ ساده از این دستور استفاده کنید.
# dialog --title "Hello" --msgbox 'Hello world!' 6 20
خروجی یه چیزی شبیه به این میشه
همونطور که میبینید با title متن نوار عنوان و با msgbox متن روی کادر محاوره رو نمایش میدیم. اندازهی کادر محاوره هم که 6 در 20 تعریف شده.
اگه خواستید از یه عنوان پشت دیالوگ استفاده کنید از backtitle کمک بگیرید.
# dialog --backtitle "System Information" --title "About" --msgbox 'This is an entirely open source software.' 10 30
حالا خروجی شبیه به این میشه.
بقیه انواع دیالوگها رو هم با استفاده از جدول زیر میتونید بسازید.
--calendar <text> <height> <width> <day> <month> <year>
--checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
--dselect <directory> <height> <width>
--editbox <file> <height> <width>
--fselect <filepath> <height> <width>
--gauge <text> <height> <width> [<percent>]
--infobox <text> <height> <width>
--inputbox <text> <height> <width> [<init>]
--inputmenu <text> <height> <width> <menu height> <tag1> <item1>...
--menu <text> <height> <width> <menu height> <tag1> <item1>...
--msgbox <text> <height> <width>
--passwordbox <text> <height> <width> [<init>]
--pause <text> <height> <width> <seconds>
--progressbox <height> <width>
--radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
--tailbox <file> <height> <width>
--tailboxbg <file> <height> <width>
--textbox <file> <height> <width>
--timebox <text> <height> <width> <hour> <minute> <second>
--yesno <text> <height> <width>
برای مثال دیالوگ yes/no
# dialog --title "Delete file" \
--backtitle "Linux Shell Script Tutorial Example" \
--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60
اینم خروجیش
اما جواب کاربر به این دیالوگها باید بررسی بشه. مثلا از کجا بفهمیم که کاربر yes رو انتخاب کرده یا no یا اصلا دکمهی Esc رو زده؟ این کار هم خیلی راحت انجام میشه. جواب این سوال توی متغیر ? ذخیره میشه. برای اینکه ببینید کاربر روی چه دکمهای کلیک کرده محتوای متغیر ? رو چاپ کنید.
# echo $?
این دستور یه عدد رو برمیگردونه که معرف دکمهی فشار داده شده توسط کاربره. مثلا برای yes عدد 0 و برای no عدد 1 و برای Esc عدد 255 توی متغیر ? ذخیره میشه.
برای اینکه بیشتر متوجه قضیه بشید این اسکریپت رو ببینید.
#!/bin/bash
# dynbox.sh - Yes/No box demo
dialog --title "Delete file" \
--backtitle "Linux Shell Script Tutorial Example" \
--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60
# Get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [Esc] key.
response=$?
case $response in
0) echo "File deleted.";;
1) echo "File not deleted.";;
255) echo "[ESC] key pressed.";;
esac
این اسکریپت قراره یه فایل رو حذف کنه. یه دیالوگ yes/no به کاربر نشون میده و بر اساس کلیدی که کاربر زده یکی از سه پیغام رو نشون میده.
response=$?
بریم سراغ یه Input dialog box
این اسکریپت رو اجرا کنید.
#!/bin/bash
# yesnobox.sh - An inputbox demon shell script
OUTPUT="/tmp/input.txt"
# create empty file
>$OUTPUT
# Purpose - say hello to user
# $1 -> name (set default to 'anonymous person')
function sayhello(){
local n=${@-"anonymous person"}
#display it
dialog --title "Hello" --clear --msgbox "Hello ${n}, let us be friends!" 10 41
}
# cleanup - add a trap that will remove $OUTPUT
# if any of the signals - SIGHUP SIGINT SIGTERM it received.
trap "rm $OUTPUT; exit" SIGHUP SIGINT SIGTERM
# show an inputbox
dialog --title "Inputbox - To take input from you" \
--backtitle "Linux Shell Script Tutorial Example" \
--inputbox "Enter your name " 8 60 2>$OUTPUT
# get respose
respose=$?
# get data stored in $OUPUT using input redirection
name=$(<$OUTPUT)
# make a decsion
case $respose in
0)
sayhello ${name}
;;
1)
echo "Cancel pressed."
;;
255)
echo "[ESC] key pressed."
esac
# remove $OUTPUT file
rm $OUTPUT
خروجی شبیه به این تصاویر خواهد بود.
همونطور که میبینید متن(رشته) وارد شده توی Input dialog box باز هم توی همون متغیر ? قرار میگیره و میتونید ازش استفاده کنید.
respose=$?
این قضیه در مورد Password box هم صادقه. بهتره امتحانش کنید.
در مورد دیالوگهای پیشرفته تر مثل Menu box توی پستهای بعدی در خدمتتون هستم.
پستهای مرتبط:
نمایش کادرهای محاورهای در Bash - قسمت دوم
نمایش کادرهای محاورهای در Bash - قسمت سوم
منبع : +