Shell实用脚本

前言

好多shell脚本,写过就扔了,感觉很可惜。本文会不断更新,用于记录自我感觉良好的脚本。以后再遇到相似的需求,方便进行参考查找。

短脚本

过滤空行

过滤hostlist.txt中的空行(linux和windows空行都进行过滤):

1
grep -v -e '^[[:space:]]*$' ng.txt

循环读取单列文本

已知hostlist.txt为:

1
2
www.baidu.com
www.voidking.com

需求:批量查询主机名或者主机IP

脚本:

1
for i in `cat hostlist.txt`;do host $i;done

文本比较

需求:两个姓名列表,需要对比出两个文件中相同的姓名和不同的姓名。

脚本:

1
2
3
cat file1 > file.txt
cat file2 >> file.txt
cat file.txt | sort |uniq -c | sort -n > result.txt

批量添加开机启动命令

已知主机列表hosts.txt内容为:

1
2
192.168.56.101
192.168.56.102

需求:给主机列表中的机器添加开机启动命令

脚本:

1
for i in `cat hosts.txt`; do ssh $i "echo '/home/voidking/start.sh' | sudo tee -a /etc/rc.local";done

curl post请求带参数

1、application/x-www-form-urlencoded请求:

1
2
3
id=1
ip=10.0.0.1
curl -d "id=${id}&ip=${ip}" http://rap2api.taobao.org/app/mock/241888/updateip

2、application/json请求:

1
curl -H "Content-type: application/json" -X POST -d '{"id":"'${id}'","ip":"'${ip}'"}' http://rap2api.taobao.org/app/mock/241888/updateip

3、multipart/form-data请求:

1
curl -F "id=${id}" -F "filename=@file.tar.gz" http://rap2api.taobao.org/app/mock/241888/updateip

长脚本

循环读取多列文本

已知mobile.txt为:

1
2
haojin 17625160000
voidking 17625160001

需求:拼接成SQL,实现根据name修改mobile。

脚本:

1
2
3
4
5
6
7
8
#!/bin/bash

grep -v "^$" mobile.txt | while read line
do
name=`echo $line | awk '{print $1}'`
mobile=`echo $line | awk '{print $2}'`
echo "update user set mobile=\"${mobile}\" where name=\"${name}\";"
done

PS:不能使用for line in cat 'mobile.txt',因为这种方法会按照空格或换行切分文本。

参数提示和校验

需求:有一个脚本,需要appname、ip、hostname、domain四个参数,并且都不能为空。

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash

# appname、ip、hostname、domain
while getopts "a:i:H:d:" opt
do
case $opt in
a)
appname=$OPTARG
echo "appname=${appname}"
;;
i)
ip=$OPTARG
echo "ip=${ip}"
;;
H)
hostname=$OPTARG
echo "hostname=${hostname}"
;;
d)
domain=$OPTARG
echo "domain=${domain}"
;;
h)
echo "-a -i -H -d are requierd"
echo "-a: appName"
echo "-i: ip"
echo "-h: hostname"
echo "-d: domain"
exit 0
;;
\?)
echo "-a -i -H -d are requierd"
echo "-a: appName"
echo "-i: ip"
echo "-h: hostname"
echo "-d: domain"
exit 1
;;
esac
done

checkOpts () {
key=$1
value=$2

if [[ ${value} == "" ]]
then
echo -e "\033[31mFATAL: ${key} should not be empty! \033[0m"
exit 1001
fi
}

checkOpts "appname" ${appname}
checkOpts "ip" ${ip}
checkOpts "hostname" ${hostname}
checkOpts "domain" ${domain}

# logic code

0%