پرسش و پاسخ شماره ۴۰ - آموزش اسکریپت نویسی
X
تبلیغات
رایتل

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

پرسش و پاسخ شماره ۴۰

پرسش و پاسخ شماره ۴۰

چگونه می‌توانم از dialog برای دریافت ورودی کاربر استفاده کنم؟

در اینجا یک نمونه هست:

  # POSIX
  foo=$(dialog --inputbox "text goes here" 8 40 2>&1 >/dev/tty)
  echo "The user typed '$foo'"

در اینجا تغییرمسیر قدری مهارت آمیز است.

  1. اول جمله ‎ foo=$(command)‎ برقرار شده، بنابراین خروجی استاندارد فرمان توسط bash ضبط می‌شود.

  2. داخل فرمان، قسمت ‎ 2>&1‎ باعث می‌شودخطای استاندارد به جایی فرستاده شود که خروجی استاندارد می‌رود-- به بیان دیگر اکنون stderr ضبط خواهد شد.

  3. بخش ‎>/dev/tty‎ خروجی استاندارد را به ترمینال ارسال می‌کند، بنابراین کادر محاوره‌ توسط کاربر دیده می‌شود. به هر حال باز هم خطای استاندارد ضبط خواهد شد.

یک سؤال رایج دیگر مرتبط با ‎dialog(1)‎، آن است که چگونه یک فرمان dialog پویایی شامل اقلامی که باید نقل‌قولی بشوند(یا به علت آنکه رشته‌های تهی هستند، یا به علت دارا بودن فضای سفید درون آنها)، تولید گردد. شخصی می‌تواند دستور eval را برای این مقصود به کار ببرد، اما پاکیزه‌ترین روش برای رسیدن به این هدف استفاده ازیک آرایه است.

  # Bash
  unset m; i=0
  words=(apple banana cherry "dog droppings")
  for w in "${words[@]}"; do
    m[i++]=$w; m[i++]=""
  done
  dialog --menu "Which one?" 12 70 9 "${m[@]}"

در این مثال، حلقه while که آرایه m را دارای عضو می‌کند، می‌توانست از لوله، فایل، و غیره خوانده بشود.

به یاد بیاورید که ساختار ‎ "${m[@]}"‎ به تمام محتویات یک آرایه بسط می‌یابد، اما با هر عضو صریحاً نقل‌قول شده. این با ساختار ‎"$@"‎ برای اداره پارامترهای مکانی قابل قیاس است. برای توضیحات بیشتر پرسش و پاسخ شماره 50 را ببینید.

نگارشهای bash جدیدتر دارای ترکیب دستوری به طور جزئی شکیل‌تری برای افزودن عناصر به یک آرایه می‌باشند:

  #  و بالاتر Bash 3.1 نگارش
  ...
  for w in "${words[@]}"; do
    m+=("$w" "")
  done
  ...

این هم مثال دیگری با استفاده از نام فایلها:

  # Bash
  files=(*.mp3)       # .اینها می‌توانند شامل فاصله‌ها، علامت آپاستروف و غیره باشند
  cmd=(dialog --menu "Select one:" 22 76 16)
  i=0 n=${#cmd[*]}
  for f in "${files[@]}"; do
      cmd[n++]=$((i++)); cmd[n++]="$f"
  done
  choice=$("${cmd[@]}" 2>&1 >/dev/tty)
  echo "Here's the file you chose:"
  ls -ld -- "${files[choice]}"

یک عمل مستقل از این پرسش اما مفید dialog، پیگردی نمودن پیشرفت پردازشی است که خروجی را تهیه می‌کند. در این پایین مثالی هست که از dialog برای پیگردی پردازشهای نوشتن در فایل ثبت وقایع، استفاده می‌کند. در پنجره dialog، یک کادر تعقیب که خروجی در آن نگهداری می‌شود و یک کادر پیغام با کلید quit قابل کلیک وجود دارد. کلیک روی کلید quit باعث اجرای trap ، حذف tempfile، و تخریب پردازش تعقیب می‌گردد.

  # POSIX(?)
  # نمی‌توانید فایلی که وجود ندارد را تعقیب کنید بنابراین  ‎
  #                   همیشه از وجود آن از قبل مطمئن شوید‎
  rm -f dialog-tail.log; echo Initialize log >> dialog-tail.log
  date >> dialog-tail.log
  tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
  trap 'rm -f $tempfile; stty sane; exit 1' 1 2 3 15
  dialog --title "TAIL BOXES" \
        --begin 10 10 --tailboxbg dialog-tail.log 8 58 \
        --and-widget \
        --begin 3 10 --msgbox "Press OK " 5 30 \
        2>$tempfile &
  mypid=$!
  for i in 1 2 3;  do echo $i >> dialog-tail.log; sleep 1; done
  echo Done. >> dialog-tail.log
  wait $mypid
  rm -f $tempfile

برای یک مثال از ایجاد نوار پیشرفت با استفاده از ‎ dialog --gauge‎, پرسش و پاسخ شماره 44 را ببینید.


CategoryShell

پرسش و پاسخ 40 (آخرین ویرایش ‎ 2011-01-18 18:55:21 ‎ توسط GreyCat)