下面这几条是我自己在写shell代码的时候,比较喜欢的几种写法,抛砖引玉。
第一种写法,比较常见:
echo abcdee | grep -q abcdif[ $?-eq 0];then echo "Found"else echo "Not found"fi
简洁的写法:
if echo abcdee | grep -q abc;then echo "Found"else echo "Not found"fi
当然你也可以不要if/else,不过这样可读性比较差:
[SunNov0405:58 AM][kodango@devops]~/workspace $ echo abcdee | grep -q abc && echo "Found"|| echo "Not found"Found
第一种写法,比较常见:
grep "abc" test.txt 1>/dev/null2>&1
常见的错误写法:
grep "abc" test.txt 2>&11>/dev/null
简洁的写法:
grep "abc" test.txt &>/dev/null
举一个实际的例子,获取Xen DomU的id。
常见的写法:
sudo xm li | grep vm_name | awk '{print $2}'
简洁的写法:
sudo xm li | awk '/vm_name/{print $2}'
假设文件内容如下所示:
[SatNov0310:04 PM][kodango@devops]~/workspace $ cat /tmp/test.txt 123
使用Sed命令:
[SatNov0310:14 PM][kodango@devops]~/workspace $ sed ':a;$!N;s/\n/,/;ta' /tmp/test.txt 1,2,3
简洁的写法:
[SatNov0310:04 PM][kodango@devops]~/workspace $ paste -sd, /tmp/test.txt 1,2,3
假设文件内容如下所示:
[SatNov0310:16 PM][kodango@devops]~/workspace $ sort /tmp/test.txt 1123
常用的方法:
[SatNov0310:16 PM][kodango@devops]~/workspace $ sort /tmp/test.txt | uniq123
简单的写法:
[SatNov0310:16 PM][kodango@devops]~/workspace $ sort /tmp/test.txt -u123
假设一个文本的每一行是一个ip地址,例如
[SatNov0310: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地址。常见的写法:
[SatNov0310:22 PM][kodango@devops]~/workspace $ grep '10.0.0.1\>' /tmp/ip.list 10.0.0.1
简单的方法(其实这方法不见得简单,只是为了说明-w这个参数还是很有用的)
[SatNov0310:23 PM][kodango@devops]~/workspace $ grep -w '10.0.0.1' /tmp/ip.list 10.0.0.1
顺便grep的-n/-H/-v/-f/-c这几参数都很有用。
常见的写法:
[SatNov0310: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月0310: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
在命令之前加上环境变更的设置,只是临时改变当前执行命令的环境。
假设只想使用$2,$3..这几个参数,常见的做法是:
shiftecho "$@"
为什么不这样写呢?
echo "${@:2}"
相信大家会有这种需求,当一个参数值没有提供时,可以使用默认值。常见的写法是:
arg=$1if[-z "$arg"];then arg=0fi
简洁的写法是这样的:
arg=${1:-0}
假设要用grep查找字符串中是否包含-i,我们会这样尝试:
[SatNov0310: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
简洁的方法是:
[SatNov0310:45 PM][kodango@devops]~/workspace $ echo 'abc-i'| grep ---iabc-i
bash中--后面的参数不会被当作选项解析。
# Check whether an item is a function# $1: the function name# Return: 0(yes) or 1(no)function is_function(){local func_name=$1 test "`type -t $1 2>/dev/null`"="function"}
不要画蛇添足再在后面加一行return $?了。
例如将数字转换成其十六进制形式,常见的写法是:
[SatNov0310:55 PM][kodango@devops]~/workspace $ var=$(printf '%%%02x'111)
简单的写法是:
[Sat