1. 入门
1)shell命令都会,如:
date
pwd
cd
ls -l
2)shell脚本的后缀约定俗成是sh,但也可以不是sh
3)shell脚本文件内容第一行 #!/bin/bash
|-- 不是必须的
|-- 表示用/bin下的bash命令解释(执行)下面的代码
|-- 假如使用sh命令执行shell脚本文件,可以没有+x 和 第一行解释器#!/bin/bash
|-- 假如不是使用sh命令,那么需要+x (执行权限)且第一行需要 #!/bin/bash
4)shell脚本内容是从上而下一行行执行
5)如何执行shell脚本?
假设在/home/hadoop/shell目录下有个hello.sh文件,文件内容为:
#!/bin/bash
echo "www.baidu.com"
执行方式1:绝对路径【需要执行权限】
chmod +x /home/hadoop/shell/examples/hello.sh
/home/hadoop/shell/examples/hello.sh
执行方式2:相对路径【需要执行权限】
chmod +x /home/hadoop/shell/examples/hello.sh
cd /home/hadoop/shell/examples
./hello.sh 【./xxx 表示当前目录下的可执行文件xxx】
hello.sh
执行方式3:sh xxx 命令表示使用sh命令执行xxx文件【不需要执行权限】
sh /home/hadoop/shell/examples/hello.sh
或
cd /home/hadoop/shell/examples
sh hello.sh
6)shell脚本的debug
方式一:sh -x xxx
方式二:shell脚本第一行 #!/bin/bash 之后加上 -x ,即#!/bin/bash -x
debug模式下
|–前面+或++后面的是shell脚本中的命令
|–不带+或++的为执行结果
2. 变量
变量定义和引用
cd /home/hadoop/shell/examples
vim variable.sh
文件内容为:
#!/bin/bash
# 静态变量
RZ='www.baidu.com'
# 动态变量(用顿号括起来)
DATE=`date`
# 动态变量实际上是命令,可以直接写上命令的完整路径,避免command not found
DATE2=`/bin/date`
# 引入方式:用括号括起来
echo ${RZ}
echo ${DATE}
# 引入方式:直接接变量名
echo $RZ
echo $DATE
# 直接接变量名,要与后面的内容空格隔开
echo $RZ z
# 这个会去找RZz变量,找不到为空
echo $RZz
说明:
静态变量:变量值可以用单引号、双引号括起来,也可以什么都不括,表示的都是字符串
K=V 或 ‘V’ 或 “V”
如:RZ='www.baidu.com'
动态变量:shell脚本写的时候,并不知道这个值是什么,只有执行到此处才知道值是什么, 动态变量值用`` 顿号括起来,实际上动态变量值放的是命令
K=`V`
如:DATE=
date
注意:动态变量放的是命令,如果提示command not found,表示在PATH环境变量中没有这个命令,所以生产上动态变量通常写命令的完整路径,如:
DATE2=`/bin/date`
引用,${变量名} 或者 $变量名(后面要有个空格,跟其它字符隔开)
如:
echo ${RZ}z
或
echo $RZ z
(后面要有个空格,跟其它内容隔开)
echo $RZz
(这种写法是错误的,会把RZz作为变量名去找,肯定找不到)
注意:=前后不能有空格
3. 传递参数
cd /home/hadoop/shell/examples
vim paramter.sh
文件内容为:
#!/bin/bash
echo $1
echo $2
echo "参数个数:$#"
echo "输出所有参数:$*"
echo "输出所有参数:$@"
echo "PID:$$"
执行
cd /home/hadoop/shell/examples
chmod +x paramter.sh
./paramter.sh
./paramter.sh abc xxx
说明:
$n 表示传递给函数或脚本的第n个参数值,n=1…9
$# 表示传递给函数或脚本的参数个数
$$ 表示进程的ID号
$* 表示传递给函数或脚本的所有参数
$@ 表示传递给函数或脚本的所有参数
$*、$@、"$*"、"$@"的区别,请看 这篇文章
4. 数组
只支持一维的
cd /home/hadoop/shell/examples
vim array.sh
文件内容为:
#!/bin/bash
arr=(zeng zhangsan lisi wangwu zhaoliu xiaoshiqi)
echo ${arr[@]}
echo ${arr[*]}
echo ${arr[4]}
echo ${#arr[@]}
执行
cd /home/hadoop/shell/examples
chmod +x array.sh
./array.sh
5. if判断
cd /home/hadoop/shell/examples
vim if.sh
文件内容为:
#!/bin/bash
a="abc"
b="hello"
# 注意==前后有空格
if [ $a == $b ];then
echo "=="
else
echo "!="
fi
执行
cd /home/hadoop/shell/examples
chmod +x if.sh
./if.sh
6. 循环
cd /home/hadoop/shell/examples
vim forwhile.sh
文件内容为:
#!/bin/bash
for x in 1 2 3 4 5
do
echo $x
done
echo "--------------------------------------"
for ((i=1;i<15;i++))
do
echo $i
done
echo "--------------------------------------"
x=1
y=1
while(($y<10))
do
echo $y
let "y++"
let "x++"
done
echo "x:${x}"
执行
cd /home/hadoop/shell/examples
chmod +x forwhile.sh
./forwhile.sh
7. 分割
cd /home/hadoop/shell/examples
vim split.sh
文件内容为:
#!/bin/bash
S="zeng,zhangsan,lisi,wangwu,zhaoliu,xiaoshiqi"
OLD_IFS="$IFS"
IFS="," #指定按什么符号进行分割
arr=($S) #待分割的字符串
IFS="OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
说明:上面OLD_IFS="$IFS" 与 IFS="OLD_IFS"的代码是固定格式的,用于按特定符号分割字符串
执行
cd /home/hadoop/shell/examples
chmod +x split.sh
./split.sh
8. awk
awk命令用于取数
1)先创建2个测试文件
cd /home/hadoop/shell/examples
mkdir awk
cd awk
vi test1.log
文件内容为
a b c
1 2 3
4 5 6
vi test2.log
文件内容为
a,b,c
1,2,3
4,5,6
2)创建awk测试shell脚本
cd /home/hadoop/shell/examples/awk
vim awk.sh
文件内容为:
# 读取test1.log内容作为 awk的输入,并打印出第一列
cat test1.log | awk '{print $1}'
# 读取test1.log内容作为 awk的输入,并打印出第一行的第1列和第3列,接着打印第二行的第1列和第3列...
cat test1.log | awk '{print $1,$3}'
# 读取test1.log内容作为 awk的输入,并打印出第1列的所有数据,接着打印第3列的所有数据
cat test1.log | awk '{print $1 $3}'
echo "---------------------------"
# 读取test2.log内容作为 awk的输入,用逗号分隔,并打印出第一行的第1列和第3列,接着打印第二行的第1列和第3列...
cat test2.log | awk -F ',' '{print $1,$3}'
# 读取test2.log内容作为 awk的输入,用逗号分隔,并打印出第1列的所有数据,接着打印第3列的所有数据
cat test2.log | awk -F ',' '{print $1 $3}'
echo "---------------------------"
# 取第二行的第3列,取第三行的第3列
cat test2.log | awk -F ',' 'NR>1 {print $3}'
执行
cd /home/hadoop/shell/examples/awk
chmod +x awk.sh
./awk.sh
9. sed
sed 替换
1)先创建1个测试文件
cd /home/hadoop/shell/examples
mkdir sed
cd sed
vi test.log
文件内容为
a b c
1 2 3
2)创建sed测试shell脚本
cd /home/hadoop/shell/examples/sed
vim sed.sh
文件内容为:
#!/bin/bash
# 替换以a开头的字符串为aa
# -i 表示替换
# 's/'表示以a为开头的字符串
sed -i 's/a/aa/' test.log
# 替换以a开头的字符串为aa,因为加了g表示全局
# 所以把所有a替换为aa
sed -i 's/a/w/g' test.log
# ^符号表示开头,
# uuu& 即在前面加uuu字符串,并拼上后面的内容
sed -i "s/^/uuu&/g" test.log
# $符号表示结尾
# &kkk 即每行的内容拼上kkk,即后面都加kkk字符串
sed -i "s/$/&kkk/g" test.log
执行
cd /home/hadoop/shell/examples/sed
chmod +x sed.sh
./sed.sh
cat test.log