1.入门
在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本,通常是如下两种
(1) #!/bin/sh
(2) #!/bin/bash
两者的区别联系:
1.sh一般为bash的软链接
2.sh调用执行脚本相当于打开了bash的POSIX标准模式
3.#!/bin/bash --posix和#!/bin/sh效果差不多
执行shell脚本的方式通常有如下三种:
-
bash file_name.sh
/bin/bash file_name.sh[hadoop@hadoop001 shell_test]$ vi first.sh #!/bin/bash echo "www.baidu.com" [hadoop@hadoop001 shell_test]$ bash first.sh www.baidu.com
这种的好处在于,不用给shell脚本赋予可执行的权限
-
/home/hadoop/shell/shell_test/file_name.sh(shell脚本绝对路径) 和 ./file_name
[hadoop@hadoop001 shell_test]$ /home/hadoop/shell/shell_test/first.sh www.baidu.com [hadoop@hadoop001 shell_test]$ ./first.sh www.baidu.com
这种执行方式需要赋予文件可执行权限
[hadoop@hadoop001 shell_test]$ chmod +x first.sh [hadoop@hadoop001 shell_test]$ ll -rwxrwxr-x 1 hadoop hadoop 33 4月 10 20:50 first.sh
-
source file_name.sh 或 . file_name.sh(注意**.**)
注:
1.shell脚本不一定全是.sh后缀,可用#对代码进行注释
2.假如使用sh命令执行脚本文件,可以没有chmod +x 和 第一行解释器#!/bin/bash,假如不是使用sh命令,那么需要chmod +x
3.从上到下一行行执行
4.#!/bin/bash -x可以进入debug模式
5.bash运行一个shell脚本,会在新的shell环境执行,source 执行脚本时,不会新开shell环境,能与当前终端共享shell环境,shell环境为一个终端
2.变量定义寄引用
[hadoop@hadoop001 shell_test]$ vi variable.sh
#!/bin/bash
BAIDU=’www.baidu.com‘
DATE=`date`
echo ${BAIDU}
echo ${DATE}
[hadoop@hadoop001 shell_test]$ sh variable.sh
’www.baidu.com‘
2019年 04月 10日 星期三 21:19:55 PDT
静态变量:
K=V ‘V’ “V” (‘V’, “V”区别在于,'is ${V}'不会解析V变量, "is ${V}"会解析V变量)
动态变量
K=V
, V用``包起来
引用方式:
$K , ${K},区别在与当如下引用时
$KA, 会去解析KA变量
${K}A,会解析K变量然后与A拼接
[hadoop@hadoop001 shell_test]$ cat variable.sh
#!/bin/bash
BAIDU=’www.baidu.com‘
DATE=`date`
A="haha"
B="xixi"
echo ${BAIDU}
echo ${DATE}
echo $AB
echo ${A}B
echo ${A}${B}
echo ${AB}
echo ${#A}
[hadoop@hadoop001 shell_test]$ bash variable.sh
’www.baidu.com‘
2019年 04月 10日 星期三 21:32:54 PDT
hahaB
hahaxixi
4
echo $AB,echo ${AB}并没有正常输出
注:
1.变量名一般都会大写,只是约定俗成的习惯,好像用小写也没什么错
2.赋值=前后不能有空格
3.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
4.中间不能有空格,可以使用下划线(_)。
5.不能使用标点符号。
6.不能使用bash里的关键字(可用help命令查看保留关键字)
3.参数传递
[hadoop@hadoop001 shell_test]$ vi parameter.sh
#!/bin/bash
echo $1
echo $2
echo "个数:$#"
echo "参数作为一个长字符串:$*"
echo "PID: $$"
[hadoop@hadoop001 shell_test]$ bash parameter.sh
个数:0
参数作为一个长字符串:
PID: 4212
[hadoop@hadoop001 shell_test]$ sh parameter.sh 1 2
1
2
个数:2
参数作为一个长字符串:1 2
PID: 4224
4.数组(只支持一维数组)
bash不支持多维数组,没有限定数组的大小。
数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
[hadoop@hadoop001 shell_test]$ vi array.sh
#!/bin/bash
arr=(beijing shanghai guangzhou chengdu shenzhen)
echo ${arr[@]} #输出数组全部内容
echo ${arr[*]} #输出数组全部内容
echo ${arr[4]} #输出索引下标为4的元素
echo ${#arr[@]} #输出数组的长度
[hadoop@hadoop001 shell_test]$ sh array.sh
beijing shanghai guangzhou chengdu shenzhen
beijing shanghai guangzhou chengdu shenzhen
shenzhen
5
4.if 判断
[hadoop@hadoop001 shell_test]$ vi if.sh
#!/bin/bash
A="abc"
B="bcd"
if [ $A == $B ];then
echo "=="
elif [ $A == "abc" ];then
echo "yep"
else
echo "!="
fi
[hadoop@hadoop001 shell_test]$ sh if.sh
yep
注:
[ $A == $B ] ==左右必须有空格,和变量赋值时相反
5.循环(for and while)
[hadoop@hadoop001 shell_test]$ vi forwhile.sh
#!/bin/bash
J=0
for x in 1 2 3 4 5
do
echo $x
let "J++"
done
echo $j
echo "-----------------------------------------------"
for ((i=1;i<10;i++))
do
echo $i
done
echo "------------------------------------------------"
X=0
while(($X<10))
do
echo $X
let "X++"
done
[hadoop@hadoop001 shell_test]$ sh forwhile.sh
1
2
3
4
5
-----------------------------------------------
1
2
3
4
5
6
7
8
9
------------------------------------------------
0
1
2
3
4
5
6
7
8
9
break.continue同样适用于shell脚本中的循环
6.分割
[hadoop@hadoop001 shell_test]$ vi split.sh
#!/bin/bash
S="beijing,shanghai,guangzhou,chengdu,shenzhen"
OLD_IFS="$IFS"
IFS=","
arr=($S)
IFS="OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
[hadoop@hadoop001 shell_test]$ sh split.sh
beijing
shanghai
guangzhou
chengdu
shenzhen
7.awk简单应用
取数
[hadoop@hadoop001 shell_test]$ vi awk.log
a b c
1 2 3
4 5 6
#打印列
[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1}'
a
1
4
[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $0}'
a b c
1 2 3
4 5 6
[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1,$2}'
a b
1 2
4 5
[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1 $2}'
ab
12
45
先打印第一列,再打印第二列
#打印行
[hadoop@hadoop001 shell_test]$ cat awk.log | awk 'NR==1' 1为行号
a b c
按注定分隔符分拆分
[hadoop@hadoop001 shell_test]$ vi awk.log
a,b,c
1,2,3
4,5,6
按照","分割并取第一列
[hadoop@hadoop001 shell_test]$ cat awk.log | awk -F "," '{print $1}'
a
1
4
按照","分割取第三列除第一行以外的元素
[hadoop@hadoop001 shell_test]$ cat awk.log | awk -F "," 'NR>1 { print $3 }'
3
6
更多可以通过awk --help查看命令帮助来学习
8.sed简单应用
[hadoop@hadoop001 shell_test]$ vi sed.log
a b c a a
1 2 3
将开头的a替换成A
[hadoop@hadoop001 shell_test]$ sed -i 's/a/A/' sed.log
[hadoop@hadoop001 shell_test]$ cat sed.log
A b c a a
1 2 3
将所有的a替换成A
[hadoop@hadoop001 shell_test]$ sed -i 's/a/A/g' sed.log
[hadoop@hadoop001 shell_test]$ cat sed.log
A b c A A
1 2 3
每行行首拼接DD
[hadoop@hadoop001 shell_test]$ sed -i 's/^/DD&/g' sed.log
[hadoop@hadoop001 shell_test]$ cat sed.log
DDA b c A A
DD1 2 3
每行行尾拼接DD
[hadoop@hadoop001 shell_test]$ sed -i 's/$/&DD/g' sed.log
[hadoop@hadoop001 shell_test]$ cat sed.log
DDA b c A ADD
DD1 2 3DD
同样也可以调用sed --help来查看帮助文档进行学习