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

转载 2012年03月24日 11:10:09

 很多人误以为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 alert=18000
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; }
5 ...

输出: 
 

这里的参数解释如下: 

  •  -t 5000:指定超时的时间,毫秒
  •  -u low:设置是否紧急
  •  -i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png


2. tput 命令 
这个命令是用来设置终端特性的: 

  •   移动光标
  •   获得终端信息
  •   设置前景和背景色
  •   设置粗体模式
  •   设置反模式等等

举例: 

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

输出: 
 

3. setleds 命令 
这个命令可以让你控制键盘灯,例如打开数字键盘灯: 

1 setleds -D +num

关闭数字键盘灯: 

1 setleds -D -num
  •   -caps: 清除大写灯
  •   +caps:打开大写灯
  •   -scroll:清除滚动锁
  •   +scroll:打开滚动锁


4. zenity 命令 
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: 

01 #!/bin/bash
02 # Get domain name
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" )
07  
08 if [ $? -eq 0 ]
09 then
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}"
21 else
22   ${_zenity} --error \
23          --text="No input provided"
24 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类库。示例代码: 

01 >#!/bin/bash
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
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.
10 response=$?
11 case $response in
12    0) echo "File deleted.";;
13    1) echo "File not deleted.";;
14    255) echo "[ESC] key pressed.";;
15 esac

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

下面这段命令可以在中断显示加下划线的文字: 

1 setterm -underline on;
2 echo "Add Your Important Message Here"
3 setterm -underline off

或者你可以关闭光标: 

1 setterm -cursor off

9. smbclient:向 MS-Windows 系统发送消息 
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: 

1 smbclient -M WinXPPro <<EOF
2 Message 1
3 Message 2
4 ...
5 ..
6 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 # 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"

你可以 使用循环来查找开着的端口: 

1 echo "Scanning TCP ports..."
2 for p in {1..1023}
3 do
4   (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
5 done

输出: 
Scanning TCP ports... 
22 open 
53 open 
80 open 
139 open 
445 open 
631 open 

下面的这个例子让你的脚本扮演HTTP客户端: 

01 #!/bin/bash
02 exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80
03  
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
08 printf "\r\n" >&3
09  
10 while read LINE <&3
11 do
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
16 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”来查询详细的使用方式。

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

转载自:http://www.csdn.net/article/2012-02-28/312483 很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜...
  • longerzone
  • longerzone
  • 2013年03月11日 22:01
  • 1964

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

http://www.oschina.net/question/28_39527?from=20120304 很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例...
  • acm_lp
  • acm_lp
  • 2015年05月18日 14:07
  • 253

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

很多朋友误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。它可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强...
  • weiyangsheng
  • weiyangsheng
  • 2013年04月04日 09:13
  • 421

笨办法13参数、解包、变量_草稿

加分习题3:将 raw_input 和 argv 一起使用,让你的脚本从用户手上得到更多的输入。from sys import argvscript, first, second, third = a...
  • p36606jp
  • p36606jp
  • 2017年07月04日 17:54
  • 130

《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记

java性能调优部分 Linux中常用的监控CPU整体性能的工具有: § mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。               ...
  • JiShuiSanQianLi
  • JiShuiSanQianLi
  • 2016年11月09日 10:05
  • 1257

很爱很爱你

想为你做些事 让你更快乐的事好在你的心中埋下我的名字求时间 趁着你 不注意的时候悄悄地 把这种子酿成果实我想他的确是 更适合你的男子我太不够体贴成熟优雅懂事如果我 退回到 好朋友的位置你也就 不再需要...
  • m_halfman
  • m_halfman
  • 2006年09月01日 14:32
  • 674

RecyclerView -- 更强大的滚动控件1

前面我们用了两节学习了ListView控件,这是一个功能及其强大的滚动控件,在过去很长一段时间甚至现在的很多场景,都会用到ListView。但是他却有着一些缺点,比如前面我们看到了,需要使用一些小技巧...
  • jiangxuefengsboke456
  • jiangxuefengsboke456
  • 2017年03月14日 20:26
  • 183

编写可靠shell脚本的八个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年09月25日 14:30
  • 1183

那些不能将我置于死地的东西,只会让我变得更加有力量!

如果一个人一生只看一部电影的话,那就应该看《肖申克的救赎》。    人人都知道,知识改变命运。其实,电影更能改变人的命运,特别是陷入低潮中的人,《肖申克的救赎》公认是史上最能改变一个人的电影,没有谁能...
  • gothicane
  • gothicane
  • 2006年08月12日 21:44
  • 1416

学习python是为了让你更好的玩

学习python是为了让你更好的玩 前言 学习一门编程语言,和学习其他技艺是一样的,但是又有不同,以往我们大多习惯于理论知识学习,然后实践,但是这对于编程来说是不合时宜的,一来是由...
  • qq_25467523
  • qq_25467523
  • 2017年05月13日 14:32
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10个工具让你的 shell 脚本更强大
举报原因:
原因补充:

(最多只允许输入30个字)