收集的48个Shell脚本小技巧
本文收集了一堆的shell脚本技巧,我说过,我写博客主要是作一些学习笔记,方便自己查阅,所以,我会搞出这么一篇文章,也没有什么不可理解的。关于这些技巧的出处,诶,我也忘了,可能来自theunixschool、commandlinefu、酷勤网和igigo.net,当然了,也有部分是我自己的经验心得,管他呢,进了我的脑子就是我的了。
0.shell调试
sh-xsomefile.sh
在somefile.sh文件里加上set+xset-x
1.用&&||简化ifelse
gzip-ta.tar.gz if[[0==$?]];then echo"goodzip" else echo"badzip" fi
可以简化为:
gzip -ta.tar.gz&&echo"goodzip"||echo"badzip"
2.判断文件非空
if[[-s$file]];then echo"notempty" fi
3.获取文件大小
stat-c%s$file stat--printf='%s\n'$file wc-c$file
4.字符串替换
${string//pattern/replacement} a='a,b,c' echo${a//,//} 5.Contains子字符串? string="Mystring" if[[$string==*My*]];then echo"It'sthere!" fi
6.rsync备份
rsync-r-t-v/source_folder/destination_folder rsync-r-t-v/source_folder[user@host:/destination_folder
7.批量重命名文件
为所有txt文件加上.bak后缀:
rename'.txt''.txt.bak'*.txt
去掉所有的bak后缀:
rename'*.bak'''*.bak
把所有的空格改成下划线:
findpath-typef-execrename's//_/g'{}\;
把文件名都改成大写:
findpath-typef-execrename'y/a-z/A-Z/'{}\;
8.for/while循环
for((i=0;i<10;i++));doecho$i;done forlinein$(cata.txt);doecho$line;done forfin*.txt;doecho$f;done whilereadline;doecho$line;done<a.txt cata.txt|whilereadline;doecho$line;done
9.删除空行
cata.txt|sed-e'/^$/d' (echo"abc";echo"";echo"ddd";)|awk'{if(0!=NF)print$0;}'
10.比较文件的修改时间
[[file1.txt-ntfile2.txt]]&&echotrue||echofalse [[file1.txt-otfile2.txt]]&&echotrue||echofalse
11.实现Dictionary结构
hput(){ eval"hkey_$1"="$2" } hget(){ evalecho'${'"hkey_$1"'}' } $hputk1aaa $hgetk1 aaa
12.去掉第二列
$echo'abcdef'|cut-d''-f1,3- $acdef
13.把stderr输出保存到变量
$a=$((echo'out';echo'error'1>&2)2>&11>/dev/null) $echo$a error
14.删除前3行
$cata.txt|sed1,3d
15.读取多个域到变量
readabc<<<"xxxyyyzzz"
16.遍历数组
array=(onetwothree) foriin${array[@]} do echo$i done
17.查看目录大小
$du–sh~/apps
18.查看CPU信息
$cat/proc/cpuinfo
19.date
$date+%Y-%m-%d 2012-12-24 $date+%Y-%m-%d–date‘-1day' 2012-12-23 $date+%Y-m-%d–date‘Dec25' 2011-12-25 $date+%Y-m-%d–date‘Dec25–10days' 2011-12-15
20.获取路径名和文件名
$dirname‘/home/lalor/a.txt' /home/lalor $basename‘/home/lalor/a.txt' a.txt
21.并集和交集
comm可以用来求并集,交集,差集,假设现在有两个文件a和b,它们的内容如下:
$cata 1 3 5
$catb 3 4 5 6 7
$commab 1 3 4 5 6 7
$comm-1-2ab#交集 3 5
$commab|sed's/\t//g'#并集 1 2 3 4 5 6 7
$comm-1-3ab|sed's/\t//g'#b-a 4 6 7