صفر و یک - برنامه نویسی - لینوکس

دست نوشته های شخصی من در مورد نرم افزار، سیستم عامل و برنامه نویسی لینوکس

صفر و یک - برنامه نویسی - لینوکس

دست نوشته های شخصی من در مورد نرم افزار، سیستم عامل و برنامه نویسی لینوکس

لیدورا یک وبلاگ تخصصی برنامه نویسی یا لینوکس نیست. بیشتر محلیه برای ثبت چیزهایی که قراره بیشتر از یه بار خونده بشن. اگه به درد شما هم خورد که زکات دانش ما پرداخت شده، شکر.

آخرین نظرات

نویسندگان

نمایش کادرهای محاوره‌ای در 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 - قسمت سوم

 

منبع : +

 

نظرات  (۶)

آهان جونم به این مطلب طولانی و عالی . وژدانی هرچی از لینوکس بلدی یاد ما بده . وژدانی
پاسخ:
در خدمتیم سعید. همین که تو راضی باشی من عذاب وژدان ندارم :)
سلام ، خیلی جالب بود ... از بچگی به این دیالوگ های علاقه داشتم ... گاهی وقت ها احساس می کنم برام جذابیتش از محیط های گرافیکی خیلی بیشتره ... خفن تره کلا :)

اگه چیزی مثل این واسه پایتونم معرفی کنید که معرکه اس !
پاسخ:
سلام مجتبی جان
توی پایتون با کتابخونه‌های خودش مثل thinker هر کاری با پنجره‌ها می‌شه کرد. البته می‌تونید اسکریپتتون رو با پایتون بنویسید و برای دیالوگ ها از بش کمک بگیرید.
آقا دمت گرم خیلی وقت بود دنبال همچین چیزی می گشتم

فقط یک سوال تو سی می شه با کتابخانه ncurses این را نوشت آیا؟؟؟؟
پاسخ:
دم شما هم گرم که به ما سر میزنید مجتبی جان.

بله اصلا کارش همینه هر چند دیگه زیاد ازش استفاده نمی‌شه
اینو ببین:
#include <ncurses.h>

int main()
{
initscr();
refresh();
printw("Hello world!!!!\n");
refresh();
getch();
endwin();
return 0;
}

سلام ،

با اطلاعات ناقص من ، تا جایی که می دونم کتابخونه thinker رابط گرافیکی از جنس پنجره و از این جور چیزهاست. نمی دونم حالا اصطلاحا بهش چی می گن ولی منظورم اینه که به طور مثال توی لینوکس بدون X-Window نمیشه ازشون استفاده کرد.

من بیشتر دنبال یه چیزی مثل دیالوگ هستم که هیچ نیازمندی خاصی نداره و کاربردشم تو ترمیناله :D
به خصوص اگه Cross Platform باشه...
پاسخ:
سلام مجتبی جان.
ببخشید منظورتو اشتباه متوجه شدم. توی پایتون می‌شه از Curses استفاده کرد. اینجا رو ببین.


عالی بود

واقعا خسته نباشید
پاسخ:
دوست داریم حمید جان
دمت گرممممم این سه پست کولاکن :دی
خیلی عالی بود نمیدونم چطور قبلا از زیر دستم در رفته بودن و نخونده بودمشون
البته میگن آلزایمر دارم شایدم خونده بودم و الان مخم ریست شده :دی
پاسخ:
:)

منتظر اسکریپت هات هستم.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی