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 的编程语言,代码块都放在一对大花括号中。若代码块较多,在闭合时,容易少写。

好的编程实践,写代码块时,比如一个函数,编写顺序应该是:

  1. 定义函数名
  2. 先打一个“{”
  3. 再打一个“}”
  4. 然后在“{}”中写代码

但是在重构代码,或者修改别人的代码时,闭合括号经常出现数量不对——因为你没办法一开始就打好成对的花括号。

在不用编辑器的情况下,我比较爱用 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"`