一、shell脚本介绍
(1)在大数据环境包括所有的环境中,shell脚本通常都是后缀为.sh,有一些会没有后缀
(2)shell脚本标准的写法,文件开头的第一行#!/bin/bash这是一个解释器,标识了脚本用什么命令去执行(不标准的写法:没有#!/bin/bash)
(3)通常执行脚本的命令是通过 ./xxx.sh ,可以进行绝对路径执行/root/learn_shell/wc.sh或者相对路径./wc.sh
(4)或者是使用sh xxx.sh执行脚本,sh是从$PATH环境变量里面找的
(5)用./xxx.sh执行脚本需要赋予权限,执行chmod +x xxx.sh或者是chmod u+x xxx.sh,其中+x代表的是用户和用户组都是+x的权限,如果是只想对用户执行权限则u+x
[root@ruozedata001 learn_shell]# vi wc.sh
[root@ruozedata001 learn_shell]# chmod +x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr-xr-x 1 root root 36 Aug 24 13:00 wc.sh 三组权限都有+x
[root@ruozedata001 learn_shell]# chmod -x wc.sh
[root@ruozedata001 learn_shell]# chmod u+x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr--r-- 1 root root 36 Aug 24 13:00 wc.sh 用户有+x权限
[root@ruozedata001 learn_shell]# ./wc.sh
www.ruozedata.com
[root@ruozedata001 learn_shell]# sh -x wc.sh
+ echo www.ruozedata.com
www.ruozedata.com
二、shell脚本的使用
变量定义与引用、传递参数、数组、if、forwhile、分割、awk、sed
1.变量定义与引用
坑:=前后不可出现空格
变量名称一般都是大写
使用变量 习惯的使用{ }
[root@ruozedata001 learn_shell]# ./variable.sh
ruozedata
date
Sat Aug 24 13:56:31 CST 2019
[root@ruozedata001 learn_shell]# cat variable.sh
#!/bin/bash
RZ="ruozedata"
DATE1='date'
DATE2=`date`
echo $rz
echo ${date1}
echo ${date2}
[root@ruozedata001 learn_shell]#
静态
k="v" 'v' v
动态
k=`v`
2.传递参数
[root@ruozedata001 learn_shell]# ./parameter.sh a b
a
b
2
a b
PID: 2400
[root@ruozedata001 learn_shell]# cat parameter.sh
#!/bin/bash
echo $1
echo $2
echo "$#" 传递参数的个数
echo "$*" 传递参数的列表作为字符串显示,显示所有参数
echo "PID: $$" 表示当前脚本运行的PID号
3、数组
元素用"空格"符号分割开,数组可以使用[1]来显示数组中元素下标位1的元素,使用[@]来显示所有元素,使用#“数组变量”[@]来显示数组中元素个数
[root@ruozedata001 learn_shell]# vi array.sh
[root@ruozedata001 learn_shell]# chmod u+x array.sh
[root@ruozedata001 learn_shell]# ./array.sh
rz jepson xingxing huhu
huhu
4
[root@ruozedata001 learn_shell]# cat array.sh
#!/bin/bash
arr=(rz jepson xingxing huhu)
echo ${arr[@]}
echo ${arr[3]}
echo ${#arr[@]}
[root@ruozedata001 learn_shell]#
4、if判断
需要注意
a. [ ] 前后空格
b. == 前后空格
[root@ruozedata001 learn_shell]# ./if.sh
abc=='abc'
[root@ruozedata001 learn_shell]# cat if.sh
#!/bin/bash
A="abc"
B="jepson"
if [ "${A}"== "${B}" ];then
echo "${A}==${B}"
elif [ "${A}" == "abc" ];then
echo "${A}=='abc'"
else
echo "!="
fi
5、for循环和while循环
[root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5
6
7
8
9
“----------”
1
2
3
4
5
6
7
8
9
[root@ruozedata001 learn_shell]# cat forwhile.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
echo $i
done
echo “----------”
j=1
while(($j<10))
do
echo $j
let "j++"
done
[root@ruozedata001 learn_shell]#
6、分割符
[root@ruozedata001 learn_shell]# chmod u+x spilt.sh
[root@ruozedata001 learn_shell]# ./spilt.sh
rz
j
xx
hh
[root@ruozedata001 learn_shell]# cat spilt.sh
#!/bin/bash
s="rz,j,xx,hh"
OLD_IFS="$IFS"
IFS=","
arr=($s)
IFS="OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
7、awk
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1}' 打印文件第一列内容
a
1
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1,$2}' 打印文件第一列跟第二列内容
a b
1 2
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1$2}' 打印文件第一列跟第二列内容,无空格
ab
12
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print}' 打印文件第一行
a b c
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print $1}' 打印文件第一行第一列
a
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR>1{print}' 打印文件大于第一行的内容
1 2 3
[root@ruozedata001 learn_shell]# cat test.log | awk -F "," '{print $1}' 以F指定分隔符,打印文件第一列
a
1
[root@ruozedata001 learn_shell]# cat test.log
a b c
1 2 3
[root@ruozedata001 learn_shell]#
8、sed
sed 选项 ‘编辑指令’ 文件路径
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
n:读取下一行,遇到n时会自动跳入下一行
[root@ruozedata001 learn_shell]# sed -i 's/a/aa/' test.log sed使用-i的时候,会改变文件内容,不输出信息
[root@ruozedata001 learn_shell]# cat test.log
aa b c
1 2 3
[root@ruozedata001 learn_shell]# sed -i "s/a/aa'/" test.log
[root@ruozedata001 learn_shell]# cat test.log
aa'a b c
1 2 3
[root@ruozedata001 learn_shell]# sed -i "s/aa'/bbb/" test.log
[root@ruozedata001 learn_shell]# cat test.log
bbba b c
1 2 3
[root@ruozedata001 learn_shell]# sed -i "s/b/j/g" test.log sed添加g参数时,才会全局替换,不然只替换文件中每行第一个参数
[root@ruozedata001 learn_shell]# cat test.log
jjja j c
1 2 3
[root@ruozedata001 learn_shell]#