from: http://www.oschina.net/question/28_39527?from=20120304
很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux
shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。
1. notify-send 命令
这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包:
1 |
$ sudo apt-get install libnotify-bin |
下面这个例子展示了如何从命令行向桌面发送一个简单的消息:
1 |
notify-send "rsnapshot
done :)" |
输出:
下面是一个复杂一点的例子:
3 |
live=$(lynx
--dump http://money.rediff.com/ | grep 'BSE
LIVE' | awk '{
print $5}' | sed 's/,//g;s/\.[0-9]*//g' ) |
4 |
[
$notify_counter - eq 0
] && [ $live - ge $alert
] && { notify-send -t 5000 -u low -i "BSE
Sensex touched 18k" ;
notify_counter=1; } |
输出:
这里的参数解释如下:
-
-t 5000:指定超时的时间,毫秒
-
-u low:设置是否紧急
-
-i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png
2. tput 命令
这个命令是用来设置终端特性的:
-
移动光标
-
获得终端信息
-
设置前景和背景色
-
设置粗体模式
-
设置反模式等等
举例:
17 |
echo "M
A I N - M E N U" |
21 |
echo "1.
User Management" |
24 |
echo "2.
Service Management" |
27 |
echo "3.
Process Management" |
35 |
read -p "Enter
your choice [1-4] " choice |
输出:
3. setleds 命令
这个命令可以让你控制键盘灯,例如打开数字键盘灯:
关闭数字键盘灯:
-
-caps: 清除大写灯
-
+caps:打开大写灯
-
-scroll:清除滚动锁
-
+scroll:打开滚动锁
4. zenity 命令
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询:
03 |
_zenity= "/usr/bin/zenity" |
04 |
_out= "/tmp/whois.output.$$" |
05 |
domain=$(${_zenity}
--title "Enter
domain" \ |
06 |
--entry
--text "Enter
the domain you would like to see whois info" ) |
11 |
whois
$domain | tee >(${_zenity}
--width=200 --height=100 \ |
12 |
--title= "whois" --progress
\ |
13 |
--pulsate
--text= "Searching
domain info..." \ |
14 |
--auto- kill --auto-close
\ |
15 |
--percentage=10)
>${_out} |
18 |
${_zenity}
--width=800 --height=600 \ |
19 |
--title "Whois
info for $domain" \ |
20 |
--text-info
--filename= "${_out}" |
23 |
--text= "No
input provided" |
输出:
5. kdialog 命令
这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下:
1 |
kdialog
--dontagain myscript:nofilemsg --msgbox "File:
'~/.backup/config' not found." |
输出
你可以查看 shell
scription with KDE Dialogs 来获取更多信息
6. Dialog
这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码:
02 |
dialog
--title "Delete
file" \ |
03 |
--backtitle "Linux
Shell Script Tutorial Example" \ |
04 |
--yesno "Are
you sure you want to permanently delete \"/tmp/foo.txt\"?" 7
60 |
12 |
0) echo "File
deleted." ;; |
13 |
1) echo "File
not deleted." ;; |
14 |
255) echo "[ESC]
key pressed." ;; |
7. logger 命令
这个命令可以让你写入系统日志例如 /var/log/messages:
1 |
logger "MySQL
database backup failed." |
2 |
tail -f
/var/log/messages |
3 |
logger
-t mysqld -p daemon.error "Database
Server failed" |
4 |
tail -f
/var/log/syslog |
输出:
Apr
20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal
Apr
20 00:12:20 vivek-desktop mysqld: Database Server failed
8. setterm 命令
这个命令可以设置中断的属性。下面的例子是强制屏幕全黑15分钟,并且60分钟后把显示器设为待机状态:
1 |
setterm
-blank 15 -powersave powerdown -powerdown 60 |
下面这段命令可以在中断显示加下划线的文字:
2 |
echo "Add
Your Important Message Here" |
或者你可以关闭光标:
9. smbclient:向 MS-Windows 系统发送消息
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息:
1 |
smbclient
-M WinXPPro <<EOF |
或者
1 |
echo "${Message}" |
smbclient -M salesguy2 |
10. Bash Socket 编程
你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件:
-
/dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
-
/dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器:
2 |
( echo >/dev/tcp/localhost/25)
&>/dev/null && echo "TCP
port 25 open" || echo "TCP
port 25 close" |
你可以 使用循环来查找开着的端口:
1 |
echo "Scanning
TCP ports..." |
4 |
( echo >/dev/tcp/localhost/$p)
>/dev/null 2>&1 && echo "$p
open" |
输出:
Scanning
TCP ports...
22
open
53
open
80
open
139
open
445
open
631
open
下面的这个例子让你的脚本扮演HTTP客户端:
02 |
exec 3<>
/dev/tcp/${1:-www.cyberciti.biz}/80 |
04 |
printf "GET
/ HTTP/1.0\r\n" >&3 |
05 |
printf "Accept:
text/html, text/plain\r\n" >&3 |
06 |
printf "Accept-Language:
en\r\n" >&3 |
07 |
printf "User-Agent:
nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}" >&3 |
关于GUITools和Cronjob
如果你使用cronjob来调用你的脚本的话,你要通过“ export
DISPLAY=[user's machine]:0”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具:
1 |
@hourly
DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh |
所有的命令你都可以通过“man”来查询详细的使用方式。