shell脚本常用语法

shell脚本常用语法

Posted by Woods on January 12, 2016

1.显示行号

vim test.sh

:set nu 显示行号

2.参数

1
2
3
4
5
echo $1
echo $2
echo "参数个数:$#"
echo "参数作为一个长字符串: $*"
echo "当时执行脚本PID: $$"

3.数组

数组只支持一维

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

arr=(aaa bbb ccc ddd eee)
echo ${arr[@]}	#数组全部的值
echo ${arr[*]}	#同上    
echo ${arr[3]}	#下标3的值(下标从0开始)
echo ${#arr[@]}	#数组的个数

结果:

1
2
3
aaa bbb ccc ddd eee
aaa bbb ccc ddd eee
ddd

5

4.if判断

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
A="aaa"
B="bbb"

if [ ${A} == ${B} ];
then
        echo "等于"
elif [ ${A} > ${B} ];
then 
echo "A > B"
else
        echo "不等于"
fi

结果: 不等于

5.循环

for 和 while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
J=0
for x in 1 2 3 4 5 6
do 
	echo $x
	let "J++"  #J自加1
done

echo ${J}	

for ((i=1;i<100;i++))
do 
	echo ${i}
done

x=1
while((x<10))
do
	echo ${x}
	let "x++"
done

6.分割

按逗号分割字符串变成数组 arr=($STR)用于将字符串$STR分割到数组$arr ${arr[0]} ${arr[1]} … 分别存储分割后的数组第1 2 … 项 ,${arr[*]}存储整个数组。变量$IFS存储着分隔符,我这里的默认分隔符是\n,然后我们将IFS设为逗号 “,” OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认(IFS=${OLD_IFS})。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

STR="aaa,bbb,ccc,ddd"
OLD_IFS="$IFS"
IFS=","
arr=(${STR})
IFS="OLD_IFS"

for x in ${arr[*]}
do
	echo $x
done

7.awk

取数 创建一个文件

1
2
3
4
vim awk.log
a b c
1 2 3
4 5 6

默认空格作为分隔符

1
cat awk.log |awk '{print $1}'  #打印第一列
1
2
3
a
1
4
1
cat awk.log |awk '{print $1,$2}' #打印1 2列
1
2
3
a b
1 2
4 5
1
cat awk.log |awk 'NR==1'  #打印第一行
1
a b c
1
cat awk.log |awk 'NR>1'  #打印大于第一行
1
2
1 2 3
4 5 6
1
cat awk.log |awk 'NR==2 {print $1}' #取第二行的第一列
1
1

已逗号(,) 拆分列

1
cat awk.log |awk -F ',' '{print $1}'  #以逗号拆分并打印第一列

8.ded

替换 创建一个文件

1
2
3
vim sed.log
a b c
1 2 3
1
2
3
4
sed -i 's/a/aa' sed.log  #将文件里的a 替换成 aa
cat sed.log
aa b c
1 2 3
1
2
3
sed -i 's?aa?bb?' sed.log  #问号(?)也可以分割
bb b c
1 2 3
1
2
3
sed -i "s/b/e/g" sed.log  #全部的b替换成e   结尾的g代表全局的
ee e c
1 2 3
1
2
3
sed -i "s/^/www&/g" sed.log  #每行的头加上www
wwwee e c
www1 2 3
1
2
3
sed -i "s/$/|end/g" sed.log #每行尾拼接 |end
wwwee e c|end
www1 2 3|end