Idle Works, Idle Thoughts

Bash 学习笔记

Bash 基础语法

if 语句

if 语句

$ if [ -e "/etc/my.cnf" ]; then echo "exist"; fi      
exist

if 语句中的比较。

[ -e filepath ] 判断文件是否存在

[ -x filepath ] 判断文件存在且可执行

[ -S filepath ] 判断文件存在且是个Socket文件

[ expr1 -a expr2 ] expr1 和 expr2 与运算。

[ expr1 -o expr2 ] expr1 和 expr2 或运算。

字符串的比较

$ if [ `whoami` != "root" ]; then echo "not root"; fi
not root

Bash 命令行技巧

简单运算:

$ echo $((10-3))
7

复杂运算,可以用 bc 计算器,如:

$ echo "scale=4;10/3"|bc
3.3333

计算字符串长度:

$ expr length "hello, world"
12

Bash 练习代码

查找所有大于 200KB 的图片,缩小为 640x480 大小

#!/bin/bash

for f in `find ./ -size +200k`; do
    convert $f -resize 640x480 $f
done

模拟 cat -n 添加行号

cat -n可以为文件添加行号(nl同样可以)。以下这个bash脚本实现同样的功能。

#!/bin/bash

sh=/bin/bash
file=$1
lines=`wc $file -l | cut -d" " -f1`
offset=`expr length $lines`
script=`mktemp`
echo "awk 'BEGIN {i=0} {printf(\"%${offset}d %s\n\", ++i, \$1)}' $file" > $script 
$sh $script | less
rm $script

它将创建一个临时脚本,并在运行完成后删除之。临时脚本的内容如

awk 'BEGIN {i=0} {printf("%2d %s\n", ++i, $1)}' /etc/passwd

其中在awk的printf中的行号偏移,是通过前面length/wc等命令计算出来的。运行效果如下:

$ ./catn.sh /etc/passwd
 1 root:x:0:0:root:/root:/bin/bash
 2 bin:x:1:1:bin:/bin:/sbin/nologin
 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 6 sync:x:5:0:sync:/sbin:/bin/sync
 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 8 halt:x:7:0:halt:/sbin:/sbin/halt
 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin