l 以文件的形式批量的存放linux 的命令集合。可以被shell解释执行,这种文件就是shell脚本程序。
l Shell程序通常由linux命令,shell命令,控制语句以及注释语句构成。
l Shell脚本是纯文本文件,可以由任何文本编辑器编写,shell文件通常是以 .sh 为文件后缀。
.bash 结尾的
Shell脚本 就是可执行命令 + 控制语句
第一行,指定哪个程序来执行脚本
#!/bin/bash 或者 #!/bin/sh
注意:#可以有空格,也可以没有空格 这一行甚至可以没有,但是这样不符合一般的规范 |
用# 表示注释
第一种方式:
Shell 如何执行
Sh xxx.sh
Bash xxx.sh
第二种方式:为这个shell脚本添加可执行权限
Chmod +x xxx.sh
./xxx.sh
l 变量名必须是以字母或者下划线开头,不能以数字开头,后面可以接字母,数字,下划线。
l 变量区分大小写
Shell中变量没有严格的类型,只有字符串和数字类型。
l 变量往往根据作用域,可以分为本地变量和环境变量。
本地变量只是在创建这个变量的shell程序中可以使用。而环境变量可以在shell中,所有的用户进程中使用,通常也被称为全部变量。
l 等号两边不能有空格
l 如果要给变量赋空值,可以在等号后面接一个换行符
在控制台打印变量的值
echo $variable 或者 ${variable}
清除变量
unset variable
显示所有变量,包括本地变量和环境变量
Set
如何把命令的输出,赋值给一个变量
` ` 这个叫飘号
A=``里面放命令,就是把这个命令输出的结果赋值给a
[hadoop@huawei shellDemo]$ a=`ls` [hadoop@huawei shellDemo]$ echo $a demo01.sh helloWorld01.sh helloWorld.sh ls.sh out specailVar01.sh specailVar02.sh specailVar.sh test
[hadoop@huawei shellDemo]$ ls demo01.sh helloWorld01.sh helloWorld.sh ls.sh out specailVar01.sh specailVar02.sh specailVar.sh test |
环境变量简称全局变量,按照惯例需要大写
export VAR
l 注意:可以被所有的shell环境下访问
l 如果父shell进程下产生了子shell进程,那么环境变量可以被“继承”并复制
讲的是给shell脚本传参数的问题
1. 如何给shell脚本穿参: xxx.sh + 空格+参数1+空格+参数2
2. 在shell脚本里面,得有类似占位符的东西,$1 表示第一个参数,$2表示第二个参数,如果不传,这个参数就是空,传多了,截取前面几个
l 位置参量是一组特殊的内置变量,通常被shell脚本用来执行命令行接收参数,或者函数用来保存换地给它的参数。
l 执行shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。
在脚本中需要使用这些参数的时候需要通过位置参量来引用,例如:
sh shell_03.sh hahhaha #!/bin.sh A=$1 echo $A
结果是:hahhaha |
$0 |
当前脚本的文件名 |
$1-$9 |
第1个到第9个位置参数 |
${10} |
第10个位置参数,类似有,${11} , ${12}.... |
$# |
位置参数的个数,注意:你传入几个,就打印几个 |
$* |
以单字符串显示所有位置参数,其实就是把位置参数打印出来 |
$@ |
没有加双引号的时候与$*含义相同,加双引号的时候有区别 |
$$ |
脚本运行的当前进程号 |
$! |
最后一个后台运行的进程的进程号 |
$? |
显示前面最后一个命令的退出状态 0 表示没有错误,其他任何值表示有错误 |
案例:
shell_04.sh #!/bin/sh echo "the count of parameters:$#" echo "first param=$1" echo "second param=$2" echo "all paramers=$*"
给 shell程序传递参数 [hadoop@huawei test]$ sh shell_04.sh this is perter the count of parameters:3 first param=this second param=is all paramers=this is perter
如果位置参数中含有空格,则需要使用双引号 [hadoop@huawei test]$ sh shell_04.sh "this is" perter the count of parameters:2 first param=this is second param=perter all paramers=this is perter |
l 任何命令进行时都将返回一个退出状态
l 查看命令:echo $?
l 应用中通常会在关键的步骤后判定$?,用来确定关键步骤的执行是否成功。尤其是调度系统里面需要监控sh返回码。在我们的项目中,书写调度脚本就用到了这个。
l Shell脚本的返回码取决于最后一个命令的返回码
l 程序控制返回码:exit N
l 退出状态0,成功,没有错误
l 退出状态不为0,失败,某处有错误
语法 [ function ] funname [()] { action; [return int;] }
function start() / function start / start()
1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译 2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255) |
格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格 例如计算(2 +3 )×4 的值 1 .分步计算 2.一步完成计算 expr `expr 2 + 3 ` \* 4 echo `expr \`expr 2 + 3\` \* 4` 或 $(((2+3)*4))
|
l 数组定义
Arr=(math english chinese)
l 数组初始化
Arr =(math english chinese)
l 数组引用
引用变量:${arr[0]}
数组个数:${#arr[*]}
所有元素:${arr[*]}
l 数组赋值
arr[0]=chinese
Date命令是比较重要的,因为我们在书写调度程序的时候,得考虑是用执行那一天的数据
如果想知道Linux系统的时间,那么就直接在指令列模糊输入date即可
[hadoop@huawei test]$ date 2017年 10月 08日 星期日 13:12:23 CST |
也可以制定日期格式
[hadoop@huawei test]$ date +%Y/%M/%D 2017/16/10/08/17 注意:m 小写表示月份month M 大写表示MINUTE 分钟 |
之前的时间
date --date='1 days ago' +%y/%m/%d |
显示当月的月历,cal
[hadoop@huawei test]$ cal 十月 2017 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
显示哪一年所有的月历 cal year
[hadoop@huawei test]$ cal 2010 2010
一月 二月 三月 日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 1 2 1 2 3 4 5 6 1 2 3 4 5 6 3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13 10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20 17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27 24 25 26 27 28 29 30 28 28 29 30 31 31 四月 五月 六月 日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31 七月 八月 九月 日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
十月 十一月 十二月 日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31 |
显示某年某月的月历:cal month year
[hadoop@huawei test]$ cal 12 2010 十二月 2010 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
关于某个档名的【文件类型】判断,如test -e filename 表示存在是否
-e |
根据文件名判断是否存在 exist |
-f |
判断目标文件是不是文件 isFile |
-d |
判断目标文件是不是目录 isDirectory |
判断目标文件的权限 test -r xxxx
-r |
判断该文件是否有可读权限 |
-w |
判断该文件是否有可写权限 |
-x |
判断该文件是否有可执行权限 |
两个整数之间的判断,例如 test n1 -eq n2
-eq |
两数值是否相等(equal) |
-ne |
两数值不等(not equal) |
-gt |
n1 大于 n2 (greater than) |
-lt |
n1 小于n2 (less than) |
-ge |
n1 大于等于n2 |
-le |
n1 小于等于n2 |
判断字符串的数据
Test -z string |
判断字符串是否为0?若string为空字符串,则为true |
Test -n string |
判断字符串是否为0?若string为空字符串,则返回false |
Test str1=str2 |
判断str1 是否等于str2,若相等,则回传true |
Test str1!=str2 |
判断str1是否不等于str2,若相等,则回传false |
利用判断符号, [] 中括号代替test,如果想知道$HOME 这个变量是否为空
[hadoop@huawei ~]$ [ -z "$HOME" ];echo $? 1 [hadoop@huawei ~]$ [ -n "$HOME" ];echo $? 0 |
注意中括号必须有空格,前面有空格,后面也得有空格
l 单层,简单条件判断式
如果只有一个判断式要进行,那么我们可以简单的这么看:
If [ 条件判断式 ];then 当条件判断式成立时,可以进行的指令工作内容; fi 结束if语句 |
如果有多个条件要判断的时候,可以将多个条件写入到一个中括号,还可以有多个中括号来隔开,而括号与括号之间,则用&& 或者|| 来隔开,意义是:
l &&表示and
l || 代表or
If 后面也有一个空格
例子:
#!/bin/bash read -p "please input your name:" NAME #printf '%s\n' $NAME if [ $NAME = root ] then echo "hello ${NAME}, welcome !" elif [ $NAME = beicai] then echo "hello ${NAME}, welcome !" else echo "SB, get out here !" fi |
脚本案例:sh ./hive_load_day.sh /home/hadoop/data/twnews_context_by_date/
#!/bin/bash
function show() { // /home/hadoop/data/twnews_context_by_date/ 就是$1 cd $1
for i in `ls` do if [ -d "$i" ] then var="$i" varin1="${var#*=}" ## echo $varin1 varin2="'/home/hadoop/data/twnews_context_by_date/sendtime="$varin1"/000000_0'" ## echo $varin2
vartsp="'${var#*=}'" ## echo $vartsp
$HIVE_HOME/bin/hive -e 'LOAD DATA local INPATH '$varin2' OVERWRITE INTO TABLE thnews_new.twnews_context_by_date PARTITION( sendtime='$vartsp')'
show "$i" fi done
cd .. } show $1
exit 0 |
If[ 条件判断式 ];then 当条件判断式成立时,执行操作; else 当条件判断式不成立时,可以进行指令工作内容; fi |
多个条件判断(if...elif...else)分多种不同的情况执行
If[ 条件判断式一 ];then
当条件判断式一成立时,可以进行指令工作内容
elif[ 条件判断式二 ];then
当条件判断式二成立时,可以进行的指令工作内容
else
当之前的条件判断式不成立,可以进行的指令工作内容;
fi
For((初始值;限制值;执行步阶)) do 程序段 done
|
这种语法适合于数值方式的运算中,在for后面的括号内的三串内容的意义是:
l 初始值:某个变量在循环中的起始值,直接类似于i=1
l 限制值:当变量的值在这个限制值的范围内,就继续进行循环。例如i <= 100
l 执行步阶:每作一次循环,变量的变化值,例如:i=i+1
案例: For in s=0 for((i=1;i<=100;i=i+1)) do s=$(($s+$i)) echo $s done
1 3 6 10 15 21 28 36 |
第二种:
for N in 1 2 3 do echo $N done 或 for N in 1 2 3; do echo $N; done 或 for N in {1..3}; do echo $N; done
|
while do done,until do done(不定循环)
一般来说,不定循环最常见的就是底下两种状态:
while [ condition ]
do
程序段落
done
While 的中文是:当...时,这种方式说的是,就进行循环,直到condition的条件不成立才停止的意思:
until [ condition ]
do
程序段落
done
这种方式恰恰与while相反,它说的是当condition条件成立时,就终止循环,否则就持续进行循环的程序段。
第一种 while expression do command … done
第二种 i=1 while ((i<=3)) do echo $i let i++ done |
格式 case $1 in start) echo "starting" ;; stop) echo "stoping" ;; *) echo "Usage: {start|stop} “ esac
|
问题:如何把一个命令的输出赋值给某个变量??
A=`ls -l`
echo $A