下面这几条是我自己在写shell代码的时候,比较喜欢的几种写法,抛砖引玉。1) 检查命令执行是否成功第一种写法,比较常见:
| echo abcdee | grep -q abcd if [ $? -eq 0 ]; thenecho "Found"elseecho "Not found"fi |
简洁的写法:
| if echo abcdee | grep -q abc; thenecho "Found"elseecho "Not found"fi |
当然你也可以不要if/else,不过这样可读性比较差:
| [Sun Nov 04 05:58 AM] [kodango@devops] ~/workspace $ echo abcdee | grep -q abc && echo "Found" || echo "Not found"Found |
2) 将标准输出与标准错误输出重定向到/dev/null第一种写法,比较常见:
| grep "abc" test.txt 1>/dev/null 2>&1 |
常见的错误写法:
| grep "abc" test.txt 2>&1 1>/dev/null |
简洁的写法:
| grep "abc" test.txt &> /dev/null |
3) awk的使用举一个实际的例子,获取Xen DomU的id。常见的写法:
| sudo xm li | grep vm_name | awk "{print $2}" |
简洁的写法:
| sudo xm li | awk "/vm_name/{print $2}" |
4) 将一个文本的所有行用逗号连接起来假设文件内容如下所示:
| [Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace $ cat /tmp/test.txt 123 |
使用Sed命令:
| [Sat Nov 03 10:14 PM] [kodango@devops] ~/workspace $ sed ":a;$!N;s/
/,/;ta" /tmp/test.txt 1,2,3 |
简洁的写法:
| [Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace $ paste -sd, /tmp/test.txt 1,2,3 |
5) 过滤重复行假设文件内容如下所示:
| [Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt 1123 |
常用的方法:
| [Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt | uniq123 |
简单的写法:
| [Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt -u123 |
6) grep查找单词假设一个文本的每一行是一个ip地址,例如
| [Sat Nov 03 10:20 PM] [kodango@devops] ~/workspace $ cat /tmp/ip.list 10.0.0.110.0.0.1210.0.0.123 |
使用grep查找是否包括10.0.0.1这个ip地址。常见的写法:
| [Sat Nov 03 10:22 PM] [kodango@devops] ~/workspace $ grep "10.0.0.1>" /tmp/ip.list 10.0.0.1 |
简单的方法(其实这方法不见得简单,只是为了说明-w这个参数还是很有用的)
| [Sat Nov 03 10:23 PM] [kodango@devops] ~/workspace $ grep -w "10.0.0.1" /tmp/ip.list 10.0.0.1 |
顺便grep的-n/-H/-v/-f/-c这几参数都很有用。7) 临时设置环境变量常见的写法:
| [Sat Nov 03 10:26 PM] [kodango@devops] ~/workspace $ export LC_ALL=zh_CN.UTF-8[六 11月 03 10:26 下午] [kodango@devops] ~/workspace $ date2012年 11月 03日 星期六 22:26:55 CST |
简洁的写法:
| [六 11月 03 10:26 下午] [kodango@devops] ~/workspace $ unset LC_ALL [Sat Nov 03 10:27 PM] [kodango@devops] ~/workspace $ LC_ALL=zh_CN.UTF-8 date 2012年 11月 03日 星期六 22:27:43 CST |
在命令之前加上环境变更的设置,只是临时改变当前执行命令的环境。8) $1,$2…等位置参数的使用假设只想使用$2,$3..这几个参数,常见的做法是:
为什么不这样写呢?
9)退而求其次的写法相信大家会有这种需求,当一个参数值没有提供时,可以使用默认值。常见的写法是:
| arg=$1 if [ -z "$arg" ]; then arg=0fi |
简洁的写法是这样的:
10)bash特殊参数–的用法假设要用grep查找字符串中是否包含-i,我们会这样尝试:
| [Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo "abc-i" | grep "-i"Usage: grep [OPTION]... PATTERN [FILE]...Try "grep --help" for more information. [Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo "abc-i" | grep "-i"abc-i |
简洁的方法是:
| [Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo "abc-i" | grep -- -iabc-i |
bash中–后面的参数不会被当作选项解析。