一、Shell编程了解
二、变量
三、传递参数
四、数组
五、if判断
六、循环
七、分割
八、awk
九、sed
十、作业
一、Shell编程了解
打印hello
vi ruoze.sh #!/bin/bash echo "hello"
二、变量
变量定义与引用
#!/bin/bash
RZ="www.ruozedata.com"
DATE=date
echo ${RZ}
echo ${DATE}
静态变量
k=字符串、"字符串"、'字符串'
动态变量
k=`v` ``符号为反引号
linux下定位行数命令:set nu 如下图:
#!/bin/bash
TEST=`java`
echo ${TEST}
注意:``反引号中的内容一定得是可执行的命令,
[hadoop@hadoop001 shell]$ ./test.sh
--------------
./test.sh: line 9: jdk: command not found
[hadoop@hadoop001 shell]$ jdk
-bash: jdk: command not found
----------------------------------------------------
echo $PATH 打印的是环境变量中的值
shell脚本中=号前后不能有空格,
变量引用: $K ${K}如这个${K}A,
${K}是一个整体
#!/bin/bash -x
RZ=‘www.ruozedata.com’
echo ${RZ}
echo ${RZ}Z
echo $RZ
echo $RZZ 他找的是整体多加Z会找不到
打印如下:
[hadoop@hadoop001 shell]$ ./test.sh
- RZ=www.ruozedata.com
- echo www.ruozedata.com
www.ruozedata.com - echo www.ruozedata.comZ
www.ruozedata.comZ - echo www.ruozedata.com
www.ruozedata.com - echo
三、传递参数
传参代码片:
echo $1 传入第一个变量
echo $2
echo "个数:$#"
echo "参数作为一个长字符串:$*"
echo "PID:$$"
ps -ef|grep 5480
执行片段:
[hadoop@hadoop001 shell]$ ./para.sh 3 5
3
5
个数:2
canshuzuoweiyige:3 5
PID:15355
[hadoop@hadoop001 shell]$ ps -ef|grep 15355
hadoop 15357 13073 0 16:41 pts/1 00:00:00 grep 15355
[hadoop@hadoop001 shell]$ ps -ef|grep 15355 |grep -v 15355 查看进程的时候把进程本身给过滤掉。
四、数组(shell脚本中只支持一维数组)
[hadoop@hadoop001 shell]$ vi arr.sh
#!/bin/bash
arr=(sail john earth fox ron)
echo ${arr[@]} 打印出所有内容
echo ${arr[*]} 打印出所有内容
echo ${arr[3]} 数组从0开始,0,1,2,3
echo ${#arr[@]} 所有内容的个数
[hadoop@hadoop001 shell]$ ./arr.sh
sail john earth fox ron
sail john earth fox ron
fox
5
五、if判断
#!/bin/bash
A="abc"
B="jepson"
if [ ${a} == ${b} ];then
echo "=="
else
echo "!="
fi
执行输出结果==,J佬挖坑,定义字符串时是A/B,if语句中又是a/b。两个空字符结果当然相等。在if条件语句中“==”号前后需要有空格。
[hadoop@hadoop001 shell]$ vi if.sh
#!/bin/bash
A="abc"
B="jepson"
if [ ${A} == ${B} ];then
echo "=="
elif [${A} == "abc" ];then
echo "abc here"
else
echo "!="
fi
打印结果:!=
会由大小写,空格引发各种问题
六、循环
#!/bin/bash
j=100
for x in 1 2 3 4 5
do
echo $x
let "j++"
done
echo $j
打印日志如下:
[hadoop@john shell]$ ./forwhile.sh
1
2
3
4
5
105
打印1-10得数
x=1
j=1
while(($j<10))
do
echo $j
let "j++"
done
echo "x:${j}"
写成死循环:
x=1
j=1
while(($j<10))
do
echo $j
let "x++"
done
echo "x:${j}"
j永远是1,死循环
七、分割
#!/bin/bash
A="sail,fox,earth,ron,tom"
OLD_IFS="$IFS"
IFS=","
arr=($A)
IFS="OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
打印结果如下:
[hadoop@john shell]$ ./fenge.sh
sail
fox
earth
ron
tom
八:awk用法
vi test.log
z a 1 3
c d 3 4
b r w 5
b t 4 5
执行如下命令(注意有无,的区别):[hadoop@john shell]$ cat test.log| awk '{print $1$2}'
za
cd
br
bt
[hadoop@john shell]$ cat test.log| awk '{print $1,$2}'
z a
c d
b r
b t
打印大于第一行第三列的数据:[hadoop@john shell]$ cat test.log |awk 'NR>1{print $3}'
3
w
4
在test.log中以逗号为分隔符,进行分割打印如下:
[hadoop@john shell]$ cat test.log
z,a,1,3
c,d,3,4
b,r,w,5
b,t,4,5
[hadoop@john shell]$ cat test.log|awk -F "," 'NR>1{print $2,$3}'
d 3
r w
t 4
[hadoop@john shell]$ cat test.log|awk -F "," 'NR>1{print $2$3}'
d3
rw
t4
九、sed替换语法
[hadoop@john shell]$ cat sed.log
aa b c
1 2 3
[hadoop@john shell]$ sed -i 's/a/aas/' sed.log
[hadoop@john shell]$ cat sed.log
aasa b c
1 2 3
[hadoop@john shell]$ sed -i 's/aasa/as/' sed.log
[hadoop@john shell]$ cat sed.log
as b c
1 2 3
sed --help查看命令帮助,替换你的字符
[hadoop@john shell]$ cat sed.log
as b c
1 2 3
[hadoop@john shell]$ sed -i "s/as/as'/" sed.log
[hadoop@john shell]$ cat sed.log
as' b c
1 2 3
把三个/可以替换为三个?
[hadoop@john shell]$ cat sed.log
as' b c
1 2 3
[hadoop@john shell]$ sed -i "s?as'?bbb?" sed.log
[hadoop@john shell]$ cat sed.log
bbb b c
1 2 3
**每行全局的b都替换为w.**
[hadoop@john shell]$ cat sed.log
bbb b c
1 2 3
[hadoop@john shell]$ sed -i "s/b/w/g" sed.log
[hadoop@john shell]$ cat sed.log
www w c
1 2 3
问题:想要在每行的行首加abc
[hadoop@john shell]$ sed -i "s/^/ddd&/g" sed.log
[hadoop@john shell]$ cat sed.log
dddwww w c
ddd1 2 3
在每行行尾加入uuu
[hadoop@john shell]$ sed -i "s/$/&uuu/g" sed.log
[hadoop@john shell]$ cat sed.log
dddwww w cuuu
ddd1 2 3uuu
生产中用的最多的是全局替换;
有g全局替换,没有g替换每行开头。
10、shell编程作业
作业:1、使用shell脚本发送qq邮件+附件(log文件)
2、拓展:shell脚本发送一个HTML表格到QQ邮箱