Testing dialog in shell scripts

Testing dialog in shell scripts

Dialog is an utility for creating professional-looking dialog boxes within shell scripts, this article just follow the introductory tutorial and present the examples of how and where it can be used.

Install dialog

First, check whether you have installed it or not: which dialog. If not, just simply install it with brew install dialog.

Dialog allows you creating text-based color dialog boxes from any shell language, which supports eight types of dialogs:

  • yes/no
  • menu
  • input
  • message
  • text
  • info
  • checklist
  • radiolist

Dialog is easy to use. To have a feeling on it, just type the following one-line example of a message box on bash shell.

dialog --title "Message box" --msgbox 'Hello, world!' 5 20

simple message box

This example creates a message box with the title of “Message box”, containing the greeting “Hello world!”. This box is 5 lines high and 20 characters wide, with message centered in the box. An “OK” button sits at the bottom, you can press Enter to dismiss the message box.

Dialog box types

Most calls to dialog are in a similar format: an optinal title, the dialog type, the text to be displayed, and the height and width of the dialog box. Additional parameters specific to the type you choose. Let’s have a brief look at each of the eight types.

yes/no box

The ‘yesno’ dialog box is very similar to our first message box example:

dialog --title "Message" --yesno "Are you having fun?" 6 25

yesno box

Trying this example, you’ll see two buttons at the bottom, labeled “Yes” and “No”. You can select between the buttons using the cursors keys (or Tab) and make selection by pressing Enter. The exit status returned to the shell will be 0 if you chose Yes and 1 if a No is selected. You can check the exit status with echo $? after selection been made.

If the width is less than the string length, the string is wrapped around at word boundaries. If the dialog box too small, then characters will be lost.

info box

The info box is similar to the message box except that it does not wait for the user to select the “OK” button. This is useful for displaying messages while an operation is going on:

dialog --infobox "Please wait..." 10 30 ; sleep 5

info box

input box

The input box allows a user to enter a string. The usual editing keys can be used, and the text fields scrolls if necessary. After the user enters the data, it is written to the standard error, or more commonly you can redirect to a file as in the example:

dialog --inputbox "Enter your name:" 8 40 2>answer

# cat answer
# Frank Lin

input box

text box

The text box is a simple file viewer; it takes a filename as a parameter:

dialog --textbox /etc/profile 22 70

textbox

You can use movement keys in the text box: the cursor keys, Page Up, Page Down, Home, etc. Exit the text box by pressing Esc or Enter.

The menu type of box allows creating a menu of choices from which user can choose. Each menu entry consists of a “tag” string and an associated “item” string, both of which are displayed. The user can make a choice using the cursor keys and pressing Enter. The selected tag is written to the standard error. In the following example, after specifying the height and width of the menu, the number 3indicates the items of choices that specify the menu-height.

dialog --menu "Choose one:" 10 30 3 'a)' red 'b)' green 'c)' blue

# or
# dialog --menu "Choose one:" 10 30 3 'a)' red 'b)' green 'c)' blue 2>selection

# cat selection
# c)

menu box

checklist box

For the checklist box, the user is presented with a list of choices and can toggle each one on or off individually using the space bar:

dialog --checklist "Choose toppings:" 10 40 3 \
	   1 Cheese on \
	   2 "Tomato Sauce" on \
	   3 Anchovies off

checklist box

The third field in each choice is the initial state; -either on or off. Also, you can redirect the selection into a file, the selected tag(s) will be recorded.

radiolist box

The radiolist box is essentially the same as the checklist except that the user must make one choice from the list of mutually exclusive options.

dialog --backtitle "CPU selection" \
	   --radiolist "Select CPU type:" 10 40 4 \
	   1 386SX off \
	   2 386DX on \
	   3 486SX off \
	   4 486DX off

radiolist box

Real application

The presented dialog boxes are normally used within the shell script to do some real works. Here is a simple but useful application from the tutorial article to back up Documents directory to an usb disk (with little modification):

#!/usr/local/bin/bash
# Backup all files under Documents directory to a usb disk
# Display message with option to cancel
dialog --title "Backup" --msgbox "Time for backup of home directory. \
Insert formatted usb disk \
and press <Enter> to start backup \
 or <Esc> to cancel." 10 50
# Return status of non-zero indicates cancel
if [ "$?" != "0" ]
then
  dialog --title "Backup" --msgbox "Backup was \
  canceled at your request." 10 50
else
  dialog --title "Backup" --infobox "Backup in process..." 10 50
  cd ~/Documents
  # Backup using zip; redirect any errors to a temporary file
  # /Volumes/FAST is my usb disk mounted on OSX
  sudo zip -r /Volumes/FAST/backup.zip . >|/tmp/ERRORS$$ 2>&1
  # zero status indicates backup was successful
  if [ "$?" = "0" ]
    then
    dialog --title "Backup" --msgbox "Backup \
    completed successfully." 10 50
    # Mark script with current date and time
    touch ~/.backup
  else
    # Backup failed, display error log
    dialog --title "Backup" --msgbox "Backup failed \
    -- Press <Enter> to see error log." 10 50
    dialog --title "Error Log" --textbox /tmp/ERRORS$$ 22 72
  fi
fi
rm -f /tmp/ERRORS$$
clear
  • backup message box backup message box
  • backup info box backup info box
  • backup success message box backup success message box

Advanced Features

There are several more things that dialog can do. You can create and use a dialogrc file to customise the color and appearance of the dialog boxes. More information are given in the man page. For more examples of using dialog you can look at the samples included in the dialog source code.

avatar

Frank Lin

Code learning...

Say something Login