基础入门
在大数据工作环境中,包括所有的组件中,一般我们说的shell脚本,后缀都是 .sh或没有后缀
1、创建一个shell脚本(标准写法)
[root@ruozedata001 learn_shell]# vi wc.sh
#!/bin/bash 使用bash的命令的解释器进行解析
echo "www.ruozedata.com"
2、执行
[root@ruozedata001 learn_shell]# ./wc.sh
-bash: ./wc.sh: Permission denied
权限错误,赋予一个+x的权限
[root@ruozedata001 learn_shell]# chmod +x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr-xr-x 1 root root 39 Aug 25 22:46 wc.sh
只想对自己的用户赋予x权限
[root@ruozedata001 learn_shell]# chmod u+x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr-xr-x 1 root root 39 Aug 25 22:46 wc.sh
1)全路径执行
[root@ruozedata001 learn_shell]# pwd
/root/learn_shell
[root@ruozedata001 learn_shell]# /root/learn_shell/wc.sh
www.ruozedata.com
2)相对路径执行
[root@ruozedata001 learn_shell]# ./wc.sh
www.ruozedata.com
3、shell脚本的不标准写法
[root@ruozedata001 learn_shell]# vi wc.sh
echo "www.ruozedata.com"
[root@ruozedata001 learn_shell]# which sh
/usr/bin/sh
[root@ruozedata001 learn_shell]# echo $PATH
/usr/java/jdk1.8.0_45/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@ruozedata001 learn_shell]# sh wc.sh
www.ruozedata.com
此时不论是绝对路径还是相对路径执行,都没有关系
4、shell脚本的debug
[root@ruozedata001 learn_shell]# sh -x wc.sh
+ echo www.ruozedata.com
www.ruozedata.com
这里有+ 的表示执行的命令行
无+ 的表示命令执行的结果
[root@ruozedata001 learn_shell]# vi wc.sh
echo "www.ruozedata.com"
echo "abcd"
[root@ruozedata001 learn_shell]# sh -x wc.sh
+ echo www.ruozedata.com
www.ruozedata.com
+ echo abcd
abcd
作用:
当执行一个超复杂的shell时,有可能出现这种情况:在本地写好,一切都很完美,扔到服务器之后发现跑不起来,有了-x之后,可以一行行去看输出的结果
5、标准写法的debug
[root@ruozedata001 learn_shell]# vi wc.sh
#!/bin/bash -x
echo "www.ruozedata.com"
echo "abcd"
[root@ruozedata001 learn_shell]# ./wc.sh
+ echo www.ruozedata.com
www.ruozedata.com
+ echo abcd
abcd
变量的定义与引用(结构:k=v)
- 静态:
k=“v” ‘v’ v 尽量用 “v” - 动态
k=v
[root@ruozedata001 learn_shell]# vi variable.sh
#!/bin/bash
rz="ruozedata"
date1='date'
date2=`date` 反斜杠:指data命令的动态结果
echo $rz
echo ${date1}
echo ${date2}
[root@ruozedata001 learn_shell]# chmod u+x variable.sh
[root@ruozedata001 learn_shell]# ./variable.sh
ruozedata
date
Sun Aug 25 23:05:15 CST 2019
坑:
- 等号= 前后不能有空格
- 变量名称一般来说都是大写
- 使用变量要习惯使用{ }
[root@ruozedata001 learn_shell]# vi variable.sh
#!/bin/bash
rz="ruozedata"
date1="date"
date2=`date`
P='ruozedata'
echo $rz
echo ${date1}
echo ${date2}
echo $PA
echo ${P}A
[root@ruozedata001 learn_shell]# ./variable.sh
ruozedata
date
Sun Aug 25 23:10:39 CST 2019
ruozedataA
此时P未加{ }时,PA是看做一个整体,是找不到的,故打印为空
传递参数
[root@ruozedata001 learn_shell]# vi parameter.sh
#!/bin/bash
echo $1 第一个变量
echo $2 第二个变量
echo "$#" 传递个数
echo "$*" 打印传递的参数的列表,作一个字符串去显示
echo "PID: $$" shell脚本执行的那一刹那,pid是2194
[root@ruozedata001 learn_shell]# chmod u+x parameter.sh
[root@ruozedata001 learn_shell]# ./parameter.sh
0
PID: 2193
[root@ruozedata001 learn_shell]# ./parameter.sh a b
a
b
2
a b
PID: 2194
# 将a b作为一个整体
[root@ruozedata001 learn_shell]# ./parameter.sh "a b"
a b
1
a b
PID: 2195
数组
[root@ruozedata001 learn_shell]# vi array.sh
#!/bin/bash -x
arr=(rz jepson xingxing huhu)
echo ${arr[@]}
echo ${arr[3]}
echo ${#arr[@]}
[root@ruozedata001 learn_shell]# chmod u+x array.sh
[root@ruozedata001 learn_shell]# ./array.sh
+ arr=(rz jepson xingxing huhu)
+ echo rz jepson xingxing huhu
rz jepson xingxing huhu
+ echo huhu
huhu
+ echo 4
4
[root@ruozedata001 learn_shell]# ./array.sh
rz jepson xingxing huhu
huhu
4
if语句
[root@ruozedata001 learn_shell]# vi if.sh
#!/bin/bash
a="abc"
b="chaofan"
if [ $a == $b ];then
echo "=="
else
echo "!="
fi
[root@ruozedata001 learn_shell]# chmod u+x if.sh
[root@ruozedata001 learn_shell]# ./if.sh
!=
小结:
- 中括号前后[ ]前后与空格
- == 前后空格
[root@ruozedata001 learn_shell]# vi if.sh
#!/bin/bash
a="abc"
b="chaofan"
if [ "${a}" == "${b}" ];then
echo "=="
else
echo "!="
fi
[root@ruozedata001 learn_shell]# ./if.sh
!=
多层判断
[root@ruozedata001 learn_shell]# vi if.sh
#!/bin/bash
a="abc"
b="chaofan"
if [ "${a}" == "${b}" ];then
echo "=="
elif [ "${a}" == "abc" ];then
echo "=="
else
echo "!="
fi
[root@ruozedata001 learn_shell]# ./if.sh
==
forwhile
[root@ruozedata001 learn_shell]# vi forwhile.sh
#!/bin/bash
for x in 1 2 3 4 5
do
echo $x
done
[root@ruozedata001 learn_shell]# chmod u+x forwhile.sh
[root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5
[root@ruozedata001 learn_shell]# vi forwhile.sh
#!/bin/bash
for x in 1 2 3 4 5
do
echo $x
done
echo "------------"
for ((i=1;i<10;i++))
do
echo $i
done
[root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5
------------
1
2
3
4
5
6
7
8
9
[root@ruozedata001 learn_shell]# vi forwhile.sh
#!/bin/bash
for x in 1 2 3 4 5
do
echo $x
done
echo "------------------"
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]# ./forwhile.sh
1
2
3
4
5
------------
1
2
3
4
5
6
7
8
9
------------------
1
2
3
4
5
6
7
8
9
分割
[root@ruozedata001 learn_shell]# vi spilt.sh
#!/bin/bash
s="rz,j,xx,huhu,yt,co"
OLD_IFS="$IFS"
IFS=","
arr=($s)
IFS="$OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
[root@ruozedata001 learn_shell]# chmod u+x spilt.sh
[root@ruozedata001 learn_shell]# ./spilt.sh
rz
j
xx
huhu
yt
co
awk
[root@ruozedata001 learn_shell]# vi test.log
a b c
1 2 3
# 打印第一列
[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]# vi test.log
a,b,c
1,2,3
[root@ruozedata001 learn_shell]# cat test.log | awk -F "," '{print $1}'
a
1
sed 替换
1、a替换为aa
[root@ruozedata001 learn_shell]# cat test.log
a,b,c
1,2,3
[root@ruozedata001 learn_shell]# sed -i 's/a/aa/' test.log
[root@ruozedata001 learn_shell]# cat test.log
aa,b,c
1,2,3
2、aa替换为aa’
[root@ruozedata001 learn_shell]# sed -i 's/aa/aa'/' test.log
> ^C
[root@ruozedata001 learn_shell]# sed -i "s/aa/aa'/" test.log
[root@ruozedata001 learn_shell]# cat test.log
aa',b,c
1,2,3
3、aa替换为bbb
[root@ruozedata001 learn_shell]# sed -i "s/aa/bbb/" test.log
[root@ruozedata001 learn_shell]# cat test.log
bbb',b,c
1,2,3
4、全局替换——b都替换成j
[root@ruozedata001 learn_shell]# sed -i "s/b/j/g" test.log
[root@ruozedata001 learn_shell]# cat test.log
jjj',j,c
1,2,3