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

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 :)"
输出:


下面是一个复杂一点的例子:
?
1
2
3
4
5
....
alert=18000
live=$(lynx --dump http: //money .rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g' )
[ $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 命令
这个命令是用来设置终端特性的:
  •   移动光标
  •   获得终端信息
  •   设置前景和背景色
  •   设置粗体模式
  •   设置反模式等等
举例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash   # clear the screen tput clear
   # Move cursor to screen location X,Y (top left is 0,0) tput cup 3 15
   # Set a foreground colour using ANSI escape tput setaf 3 echo "XYX Corp LTD."
tput sgr0
   
tput cup 5 17 # Set reverse video mode tput rev echo "M A I N - M E N U"
tput sgr0
   
tput cup 7 15 echo "1. User Management"
   
tput cup 8 15 echo "2. Service Management"
   
tput cup 9 15 echo "3. Process Management"
   
tput cup 10 15 echo "4. Backup"
   # Set bold mode tput bold
tput cup 12 15 read -p "Enter your choice [1-4] " choice
   
tput clear
tput sgr0
tput rc
输出:


3. setleds 命令
这个命令可以让你控制键盘灯,例如打开数字键盘灯:
?
1
setleds -D +num
关闭数字键盘灯:
?
1
setleds -D -num
  •   -caps: 清除大写灯
  •   +caps:打开大写灯
  •   -scroll:清除滚动锁
  •   +scroll:打开滚动锁

4. zenity 命令
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# Get domain name _zenity= "/usr/bin/zenity"
_out= "/tmp/whois.output.$$"
domain=$(${_zenity} --title  "Enter domain" \
                 --entry --text "Enter the domain you would like to see whois info" )
   if [ $? - eq 0 ] then
   # Display a progress dialog while searching whois database   whois $domain  | tee >(${_zenity} --width=200 --height=100 \
                       --title= "whois" --progress \
                         --pulsate --text= "Searching domain info..." \
                                     --auto- kill --auto-close \
                                     --percentage=10) >${_out}
   
   # Display back output   ${_zenity} --width=800 --height=600  \
          --title "Whois info for $domain" \
          --text-info --filename= "${_out}" else
   ${_zenity} --error \
          --text= "No input provided" fi
输出:

Fig.04: zenity in Action

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类库。示例代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> #!/bin/bash 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
7. logger 命令
这个命令可以让你写入系统日志例如 /var/log/messages:
?
1
2
3
4
logger "MySQL database backup failed." tail -f /var/log/messages
logger -t mysqld -p daemon.error "Database Server failed" 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
下面这段命令可以在中断显示加下划线的文字:
?
1
2
3
setterm -underline on; echo "Add Your Important Message Here"
setterm -underline off
或者你可以关闭光标:
?
1
setterm -cursor off
9. smbclient:向 MS-Windows 系统发送消息
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息:
?
1
2
3
4
5
6
smbclient -M WinXPPro <<EOF Message 1
Message 2
...
.. 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扫描器:
?
1
2
# find out if TCP port 25 open or not ( echo > /dev/tcp/localhost/25 ) &> /dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"
你可以 使用循环来查找开着的端口
?
1
2
3
4
5
echo "Scanning TCP ports..." for p in {1..1023} do
   ( echo > /dev/tcp/localhost/ $p) > /dev/null 2>&1 && echo "$p open" done
输出:
Scanning TCP ports...
22 open
53 open
80 open
139 open
445 open
631 open

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值