shell
Table of Contents
1. 复制文件时显示进度
rsync -av --progress 源 目标
2. 记录命令执行过程
有时写笔记时,需要贴一大堆 shell 命令执行过程。
直接执行 script 命令,将会把所有命令执行的过程(包括显示结果)给记录到指定的文件中去。如果不指定文件,默认记录到 typescript 文件中。输入 exit 结束记录过程,并且 script 会在记录文件中添加结束时间。
$ script /tmp/log # 开始记录命令 脚本已启动,文件为 /tmp/log $ echo 'hello world' hello world $ ping www.qq.com PING www.qq.com (182.254.8.146) 56(84) bytes of data. ^C64 bytes from 182.254.8.146: icmp_seq=1 ttl=52 time=77.8 ms --- www.qq.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 77.858/77.858/77.858/0.000 ms $ exit # exit 退出记录 脚本完成,文件为 /tmp/log $ cat /tmp/log 脚本启动于 2014年10月01日 星期三 23时53分38秒 $ echo 'hello world' hello world $ ping www.qq.com PING www.qq.com (182.254.8.146) 56(84) bytes of data. ^C64 bytes from 182.254.8.146: icmp_seq=1 ttl=52 time=77.8 ms --- www.qq.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 77.858/77.858/77.858/0.000 ms $ exit 脚本完成,于 2014年10月01日 星期三 23时53分53秒
3. 检查花括号对数
类 C 的编程语言,代码块都放在一对大花括号中。若代码块较多,在闭合时,容易少写。
好的编程实践,写代码块时,比如一个函数,编写顺序应该是:
- 定义函数名
- 先打一个“{”
- 再打一个“}”
- 然后在“{}”中写代码
但是在重构代码,或者修改别人的代码时,闭合括号经常出现数量不对——因为你没办法一开始就打好成对的花括号。
在不用编辑器的情况下,我比较爱用 shell 来检查:
fgrep { file -o | wc -l fgrep } file -o | wc -l
fgrep/grep 的 -o 参数控制只显示匹配的字符。
当然,这种方式只能检查花括号是否成对,若要检查括号位置是否正确,还得看代码。
4. 生成连续数字
方法1:
for i in {1..10};do echo $i;done
方法2:
for i in $(seq 1 10);do echo $i;done
如果要生成:
01 02 03
这样的格式,指定参数 w 即可
5. 快速创建文件的备份
cp xxx{,.bak}
利用了 shell 大括号的展开操作 xxx{,.bak} 返回的结果是 xxx xxx.bak。可以验证下:
$ echo test{,.bak} test test.bak
6. 替换上条命令的部分内容
假如上条命令是:
cat 1.log |less
现在需要看 2.log:
输入:
^1.log^2.log^
注意:为了快速获取上条命令的第二个参数,可以:按 Alt+2(上条命令第 2 个参数)、Alt+.
7. 删除指定目录所有文件,并排除某些文件
rm -rf ls | grep -v 文件名
或者:
rm -rf ls | grep -v '[1|2|3].php'
8. 判断目录是否为空
if [ "$(ls -A ${dir_name})" = "" ];then echo 'empty' else echo 'not empty' fi
9. for 循环中处理文件名中的空格
设置 IFS 变量即可:
IFS=`echo -en "\n\b"`