1.在shell编程之前
①:关于shell:shell通常以.sh结尾,但.sh结尾的并不一定是可执行脚本
②:shell脚本头文件一般以 #!/bin/bash开头
③:在完成shell文件的编写后,需要为脚本文件赋予权限才可执行
通常为 chmod +x xxx.sh 或者 chmod 775 xxx.sh
2.shell脚本Debug模式
通过-x参数进入Debug模式 即sh -x xxx.sh
可以查看程序中的变量及参数
3.shell脚本常用功能
①变量与变量的传递
#!/bin/bash
#历史文件文件名
FILE_ALL='qk_chi_all'
#所有 qk_chi库 历史文件
FILE_QK_CHI=$2
#获取当前所有qk_chi库
PRESENT_QK_CHI=`sqoop-list-databases --connect jdbc:mysql://$URL --username $UNAME --password $PWD | grep -i $3`
-----------
- 变量名一般采用大写
- 变量的赋值左右不可以有空格
- ''包起来的数据代表字符串,想要表示'需要转义\'
- ``包起来的数据代表命令
上面的PRESENT_QK_CHI被执行 即执行对应的sqoop语句
②数组 (linux种数组为一维数组)
arr=(dingyi zhaoer zhangsan lisi wangwu)
echo ${arr[@]} //数组中所有元素
echo ${arr[*]} //数组中所有元素
echo ${arr[4]} //数组中第五个元素
echo ${#arr[@]} //数组的元素个数
[hadoop@hadoop data]$ ./test.sh
dingyi zhaoer zhangsan lisi wangwu
dingyi zhaoer zhangsan lisi wangwu
wangwu
5
②if 条件判断
#!/bin/bash
A="abc"
B="efgh"
if [ "${a}" == "$b" ];then //与fi成对出现
echo "=="
else
echo "!="
fi //与if成对出现
[hadoop@hadoop data]$ ./test.sh
==
③循环
#!/bin/bash
j=0
for x in 1 2 3 4 5
do
echo $x
let "j++"
# let表示后面的值要进行运算
done
echo $j
echo "------------------"
for ((i=1;i<5;i++))
do
echo $i
done
echo "===================="
x=1
y=1
while(($y<5))
do
echo $y
let "y++"
let "x++"
done
echo "x: ${x}"
[hadoop@hadoop data]$ ./test.sh
1
2
3
4
5
5
------------------
1
2
3
4
====================
1
2
3
4
x: 5
④分割
S="wangwu,zhangsan,lisi,dingyi"
OLD_IFS="$IFS"
IFS=","
arr=($S)
IFS="OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
[hadoop@hadoop data]$ ./test.sh
wangwu
zhangsan
lisi
dingyi
--------------
这里记住这种固定写法即可
OLD_IFS="$IFS"
IFS=","-分隔符
arr=($S)-分割结果为数组
IFS="OLD_IFS"
⑤awk操作命令
基础数据
[hadoop@hadoop data]$ cat test.txt
1 2 3
4 5 6
7 8 9;
- 打印第一列和第二列
cat test.txt |awk '{print $1,$2}'
1 2
4 5
7 8
cat test.txt |awk '{print $1 $2}'
12
45
78
-F ","
可以使用-F执行分隔符,不指定默认空格
[hadoop@hadoop data]$ cat test.txt |awk -F "," 'NR==3'
7,8,9
按照行号进行输出
⑥sed操作命令
[hadoop@hadoop data]$ vi test.log
a b c
1 2 3
替换a为aa
[hadoop@hadoop data]$ sed -i 's/a/aa/' test.log
[hadoop@hadoop data]$ cat test.log
aa b c
1 2 3
将aa替换为aa'
[hadoop@hadoop data]$ sed -i "s/aa/aa'/" test.log
[hadoop@hadoop data]$ cat test.log
aa' b c
1 2 3
将aa'替换为bbb【将/换为?用是一样的】
[hadoop@hadoop data]$ sed -i "s?aa'?bbb?" test.log
[hadoop@hadoop data]$ cat test.log
bbb b c
1 2 3
全局替换 g表示全局global
[hadoop@hadoop data]$ sed -i "s/b/w/g" test.log
[hadoop@hadoop data]$ cat test.log
www w c
1 2 3
每行的行首前面加uuu
[hadoop@hadoop data]$ sed -i "s/^/uuu&/g" test.log
[hadoop@hadoop data]$ cat test.log
uuuwww w c
uuu1 2 3
每行行尾后面加uuu
[hadoop@hadoop data]$ sed -i "s/$/&uuu/g" test.log
[hadoop@hadoop data]$ cat test.log
uuuwww w cuuu
uuu1 2 3uuu