第8期:shell

数字比较符eq
1
2
3
4
5
6
7
8
9
10
只能比较数字,若字符则会被转成数字,如字符0不会等于数字0

-ne // 不等于
-gt // 大于
-eq // 等于
-lt // 小于

if [ 1 -eq 0 ];then
echo "eq"
fi
特殊变量
1
2
3
4
5
6
7
8
9
10
$0 当前脚本名称
$n 传递给脚本的第几个参数,如$1获取第一个参数
$# 传递给脚本的参数个数
$* 传递给脚本的所有参数
$? 上个命令的退出状态
$$ 当前shell的pid

# 示例
cd /optsafjlajdk
echo $? // 切换到一个不存在的目录,返回1不正常状态
if/else
1
2
3
4
5
6
7
branch_name="test"

if [ ${branch_name} == "test" ];then
echo "yes"
else
echo "no"
fi
case
1
2
3
4
5
6
7
8
9
10
11
12
13
14
env=$1
case $env in
release)
echo "release"
wait
;;
test)
echo "test"
wait
;;
*)
echo "any"
;;
esac;
文件表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
// -e 文件存在则为真
// -d 目录存在则为真
// -s 判断文件是否为空

if [ -s empty.log ];then
echo "not emp"
else
echo "emp"
fi

if [ -d test1 ];then
echo "存在";
fi
字符串表达式比较
1
2
3
4
5
6
7
8
9
10
11
a="a"
b="a"
c="c"
if [ $a = $b -o $a = $c ];then
echo "eq"
fi

// Note: $a = $b 不能写成$a=$b
// -o 表逻辑或
// -a 表逻辑与
// ! 表逻辑非,如if [ $a != $c ]
for
1
2
3
for i in `seq 10`;do
echo $i
done
sh -x 显示执行过程
1
2
3
4
5
6
7
8
9
例子1:
如有脚本test.sh,内容:

echo "hello"

执行sh -x test.sh,结果:

+ echo hell
hell
1
2
3
4
5
6
7
8
9
10
11
例子2:
echo "hell"

echo `dirname $PWD` # 注意这条语句包含多个执行过程,打印结果的时候会有两个+号

执行后,
+ echo hell
hell
++ dirname /opt/test/process
+ echo /opt/test
/opt/test

sh -n
检查脚本语法

time sh test.sh
脚本执行时间

set

set -e # 若指令传回值不为0,立即退出脚本

linux常用命令

1
2
3
4
5
6
7
8
9
10
zip -qr yasuo.zip yasuo # -q变不显示压缩信息,-r 表递归压缩下面层级的目录或文件

cat access.log| awk '{print $4}'|sort | uniq -c| sort -nr # 排序

# 查找1天前以.gz结尾的日志,并批量删除
find /var/log/nginx/ -name "*.gz" -type f -mtime +1|xargs rm -f

## vim技巧
:set ff # 查看文本格式
:set binary # 改为unix格式