简洁的Bash编程技巧续篇

上一篇文章发表后反响还是不错的,让我这个博客热闹了不少,以后我会陆陆续续将自己学到的一些新的技巧更新在这篇续篇中,当然也希望其它同学也能一起分享你们的技巧。续篇中有部分的内容已经偏离bash编程了,而是命令行下的技巧,题目我暂时不改,请见谅。

1) bash中alias的使用

alias其实是给常用的命令定一个别名,比如很多人会定义一下的一个别名:

alias ll='ls -l'

以后就可以使用ll,实际展开后执行的是ls -l。

现在很多发行版都会带几个默认的别名,比如:

alias grep='grep --color=auto'  # 带颜色显示
alias ls='ls --color=auto' # 同上
alias rm='rm -i'  # 删除文件需要确认

alias在某些方面确实提高了很大的效率,但是也是有隐患的,这点可以看我以前的一篇文章终端下肉眼看不见的东西。那么如何不要展开alias,而是用本来的意思呢?答案是使用转义:

\ls
\grep

在命令前面加一个反斜杠后就可以了。

这里要插一段故事,前两天我在shell脚本中定义了下面的一个alias,假设位于文件util.sh:

#!/bin/bash
...
alias ssh='ssh -o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'
...

后面这串ssh选项是为了去掉一些warning的信息,不提示输入密码等等。具体可以看ssh的文档说明。我自己测试的时候好好的,当时我同事跑得时候却依然有报Warning。我对比了下我们两个人的用法:

sh util.sh  # 我的
./util.sh   # 他的

大家应该知道,直接./util.sh执行,shell会去找脚本第一行的shebang中给定的解释器去执行改脚本,所以第二种用法相当于直接用 bash来执行。那想必是bash/sh对alias是否默认展开这一点上是有区别的了(可能是bash版本的问题,RHEL 5U4)。翻阅了下Bash的man手册,发现可以通过设置expand_aliases选项来打开alias展开的功能,默认在非交互式Shell下是 关闭的(什么是交互式登录Shell)。

修改下util.sh,打开这个选项就Ok了:

#!/bin/bash
...
# Expand aliases in script
shopt -s expand_aliases
alias ssh='ssh -o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'
...

2)awk打印除第一列之外的其他列

awk用来截取输入行中的某几列很有用,当时如果要排除某几列呢?

例如有如下的一个文件:

$ cat /tmp/test.txt
1 2 3 4 5
10 20 30 40 50

可以用下面的代码解决(来源):

$ awk '{$1="";print $0}' /tmp/test.txt
 2 3 4 5
 20 30 40 50

但是前面多了一个空格,可以用cut命令稍微调整下:

$ awk '{$1="";print $0}' /tmp/test.txt | cut -c2-
2 3 4 5
20 30 40 50

3)巧用bash的命令展开功能备份文件

假设要备份文件/your/path/to/file.list为/your/path/to/file.list.20121106,常规的方法是:

cp /your/path/to/file.list /your/path/to/file.list.20121106

这样重复写上一长串的路径,是不是很麻烦,这里利用bash的展开特性可以这样做:

cp /your/path/to/file.list{,.bak}

/your/path/to/file.list{,.bak}这一部分会展开为/your/path/to/file.list /your/path/to/file.list.20121106,再将此传给cp命令,就达到了与前面同样的效果。(思路同ls *)。具体可以man bash中的Brace Expansion这一段。

4)命令行下使用ctrl+x ctrl+e来编辑当前命令。

这个技巧来自。使用方法是键入命令之后,再按ctrl+x ctrl+e可以打开一个编辑器来编辑命令,默认是使用emacs。你也可以通过在~/.bashrc中添加以下这一行,将编辑器换成vim:

export EDITOR='vim'

为什么推荐这一条呢?对于一般的命令(这里指的是长度很短的命令)其实这个技巧没什么用处,我用方向键移一下就OK了,但是有时候(尤其是运维的一 些命令)有些命令长度特别长,一堆参数,如果直接在命令行修改其实风险很高的(可以通过在命令的开头加上一个#号来规避这个风险,Bash将当前的命令当 成注释不执行),而且方向键一个一个迁移非常不方便(当然有类似ctrl+x ctrl+e这种预设的快捷键来操作,可以看bind -p)。

像使用ctrl+x,ctrl+e打开vim来编辑命令在这种场景有两种好处:
1. 可以方便的用熟悉的编辑器高效地修改命令;
2. 有一个确认的过程,无误后,退出vim才执行命令。

不过我不是很推荐最牛B的 Linux Shell 命令 系列连载中的一些对历史命令的技巧,虽然方便,但是风险很高,因为没有一个确认的过程,是执行将历史命令调出就执行了。

 

转自:http://kodango.me/simple-bash-programming-skills-2

“简洁的Bash编程技巧续篇”的一个回复

发表评论

电子邮件地址不会被公开。

为防止垃圾评论影响阅读效果,请您耐心回答以下问题,谢谢合作 *