【转】10个工具让你的 shell 脚本更强大

1585阅读 0评论2012-04-28 Linuxer2011
分类:LINUX

很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。 

1. notify-send 命令 
这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包: 
1$ sudo apt-get install libnotify-bin
下面这个例子展示了如何从命令行向桌面发送一个简单的消息: 
1notify-send "rsnapshot done :)"
输出: 
 

下面是一个复杂一点的例子: 
1....
2alert=18000
3live=$(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 Sen*** touched 18k";  notify_counter=1; }
5...
输出: 
 

这里的参数解释如下: 

2. tput 命令 
这个命令是用来设置终端特性的: 
举例: 
01#!/bin/bash
02  
03# clear the screen
04tput clear
05  
06# Move cursor to screen location X,Y (top left is 0,0)
07tput cup 3 15
08  
09# Set a foreground colour using ANSI escape
10tput setaf 3
11echo "XYX Corp LTD."
12tput sgr0
13  
14tput cup 5 17
15# Set reverse video mode
16tput rev
17echo "M A I N - M E N U"
18tput sgr0
19  
20tput cup 7 15
21echo "1. User Management"
22  
23tput cup 8 15
24echo "2. Service Management"
25  
26tput cup 9 15
27echo "3. Process Management"
28  
29tput cup 10 15
30echo "4. Backup"
31  
32# Set bold mode
33tput bold
34tput cup 12 15
35read -p "Enter your choice [1-4] " choice
36  
37tput clear
38tput sgr0
39tput rc
输出: 
 

3. setleds 命令 
这个命令可以让你控制键盘灯,例如打开数字键盘灯: 
1setleds -D +num
关闭数字键盘灯: 
1setleds -D -num

4. zenity 命令 
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: 
01#!/bin/bash
02# Get domain name
03_zenity="/usr/bin/zenity"
04_out="/tmp/whois.output.$$"
05domain=$(${_zenity} --title  "Enter domain" \
06                --entry --text "Enter the domain you would like to see whois info" )
07  
08if [ $? -eq 0 ]
09then
10  # Display a progress dialog while searching whois database
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}
16  
17  # Display back output
18  ${_zenity} --width=800 --height=600  \
19         --title "Whois info for $domain" \
20         --text-info --filename="${_out}"
21else
22  ${_zenity} --error \
23         --text="No input provided"
24fi
输出: 

Fig.04: zenity in Action 

5. kdialog 命令 
这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下: 
1kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
输出 
 

你可以查看  来获取更多信息 

6. Dialog 
这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码: 
01>#!/bin/bash
02dialog --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
05  
06# Get exit status
07# 0 means user hit [yes] button.
08# 1 means user hit [no] button.
09# 255 means user hit [Esc] key.
10response=$?
11case $response in
12   0) echo "File deleted.";;
13   1) echo "File not deleted.";;
14   255) echo "[ESC] key pressed.";;
15esac
7. logger 命令 
这个命令可以让你写入系统日志例如 /var/log/messages: 
1logger "MySQL database backup failed."
2tail -f /var/log/messages
3logger -t mysqld -p daemon.error "Database Server failed"
4tail -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分钟后把显示器设为待机状态: 
1setterm -blank 15 -powersave powerdown -powerdown 60
下面这段命令可以在中断显示加下划线的文字: 
1setterm -underline on;
2echo "Add Your Important Message Here"
3setterm -underline off
或者你可以关闭光标: 
1setterm -cursor off
9. smbclient:向 MS-Windows 系统发送消息 
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: 
1smbclient -M WinXPPro <
2Message 1
3Message 2
4...
5..
6EOF
或者 
1echo "${Message}" | smbclient -M salesguy2
10. Bash Socket 编程 
你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件: 
  
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器: 
1# find out if TCP port 25 open or not
2(echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo"TCP port 25 close"
你可以 : 
1echo "Scanning TCP ports..."
2for p in {1..1023}
3do
4  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
5done
输出: 
Scanning TCP ports... 
22 open 
53 open 
80 open 
139 open 
445 open 
631 open 

下面的这个例子让你的脚本扮演HTTP客户端: 
01#!/bin/bash
02exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80
03  
04printf "GET / HTTP/1.0\r\n" >&3
05printf "Accept: text/html, text/plain\r\n" >&3
06printf "Accept-Language: en\r\n" >&3
07printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}"   >&3
08printf "\r\n" >&3
09  
10while read LINE <&3
11do
12   # do something on $LINE
13   # or send $LINE to grep or awk for grabbing data
14   # or simply display back data with echo command
15   echo $LINE
16done
关于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”来查询详细的使用方式。

转自
上一篇:【转】VirtualBox虚拟机网络设置(四种方式)
下一篇:【转】linux系统获取基础硬件信息的shell