6.shell脚本
6.1 shell基础语法
6.1.1 shell的概述
-
- shell的基本概念
1.什么是shell
-
-
-
- shell是用户和Linux操作系统之间的接口,它提供了与操作系统之间的通讯方式
- shell是一个命令解释器,它接收用户发出的命令,然后调用相应的应用程序
-
-
2.系统提供了哪些种类的shell
通过cat /etc/shells可查阅系统提供的shell
本文主要介绍/bin/bash,因为它兼容于sh,它是依据使用者需求而对sh进行了加强
6.1.2 shell中的变量
-
- shell中变量的基本概念
1.什么是变量
-
-
-
- 变量是值可以改变的量,在计算机中变量能存储计算结果或者表示某一个值
- 例如:y = x + 1,其中y就是变量
-
- 变量的读取
-
1.通过echo命令读取
语法格式1: echo $变量名
语法格式2: echo ${变量名}
示例:
读取登录用户名:echo $LOGNAME
读取用户home目录:echo $HOME
读取当前系统默认的shell:echo $SHELL
注意:当变量名后面连着其他符号时,为了避免不必要的错误建议使用格式2
-
- 环境变量的设置与查看
1.环境变量的查看
语法格式: env|more
设置环境变量使用set命令
-
- 将普通变量变为环境变量
1.通过关键字:export
语法格式1: export 变量名=变量值
语法格式2:变量名=变量值
export 变量名
-
- 局部变量的设置规则
1.变量与变量内容以一个等号"="连接,变量名=变量值
2.等号两边不能直接接空格符,如(变量名 = 变量值)这是错误的
3.变量名称只能是英文字符、数字、下划线组成,但是不能以数字开头
4.变量内容若有空格符可使用双引号或者单引号将变量内容结合起来
|-双引号中的特殊字符保有原本的特性
|-例如:var="lang is ${LANG}",则echo $var的结果为lang is en_US.UTF-8
|-单引号中的特殊字符仅为存文本(一般字符),就类似java中的String类型的数据
|-例如:var='lang is ${LANG}',则echo $var的结果为lang is ${LANG}
5.可以使用转义字符"\"将特殊符号(如$、\、!等)变为一般字符
6.如果变量的内容是由其他命令提供的,需要使用$(命令)来获取变量的值
|-示例
-
- 变量的其他操作
1.为变量增加额外内容
示例:
2.取消变量的定义
语法格式: unset 变量名
示例:
注意:
如果取消系统的环境变量,需要修改/etc/profile文件,不然不生效
系统默认的变量通常变量名都为大写,自定义的变量建议使用小写,方便区分
-
- 把一个命令定义成一个变量
1.使用反引号(反引号为tab键上方的按键)
语法格式: 变量名=·命令名· (使用反引号包住命令)
示例:
由示例看出,这种方式变量的值就为命令获取的值
2.使用圆括号
语法格式: 变量名=(命令)
示例:
由示例看出,此种方式变量的值就是命令本身
-
- 变量总结
1.全局变量:
-
-
-
- 一般全大写,比如环境变量
-
-
2.局部变量:
-
-
-
- 在脚本函数中的局部变量通常使用local修饰
- local I :表示变量i的有效范围在该函数的内部有效
-
-
3.把一个命令定义成一个变量$(命令)或者·命令·
4.若变量和其他字符组成新的变量就需要个变量加上大括号,否则容易出错如${date}day
6.1.3 数据重定向
-
- 数据重定向概述
1.数据重定向的基本概念
-
-
-
- 数据重定向就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方
- 通常执行一条命令的时候会有标准输出和标准错误输出
- 标准输出:是指命令执行之后,传回正确信息的输出目标
- 标准错误输出:是指命令执行失败后,所传回错误信息的输出目标
-
-
-
- 数据重定向的应用
1.数据重定向的命令及其对应的编号
数据重定向对应的编号
常用的组合命令及其含义
示例:将ls的输出重定向到ls.log文件中
2.使用数据重定向的方式书写内容到指定文件
语法格式: cat > filename << "EOF"
输入此命令,此后所有的内容都会有">"提示输入,直到输入一个"EOF",才会关闭输入流
示例:
3.使用数据重定向测试执行程序
对程序进行测试,就是看看能否执行成功,无需显示执行过程和信息
示例:
示例中,/dev/null,叫做"黑洞",把数据输出到此设备中,不会被保存,而是被丢弃
2>&1:表示无论是错误的还是正确的信息都输出到/dev/null设备中
6.1.4 命令回传值
-
- 命令回传值概述
1.命令回传值的基本概念
-
-
-
- 在Linux系统中,一个命令执行完之后,必然会有一个回传值,作用是用于判断命令是否执行成功
- 在Linux系统中,回传值为0表示的含义就类型java中的true,其他数字均表示为false
- Linux中通过:echo $?,来获取回传值
-
- 命令回传值的应用
-
1.Linux系统中的短路与(&&)和短路或(||)
短路与和短路或的应用
示例:判断/temp/test是否存在,存在则创建/temp/test/test.txt
6.1.5 常用的shell命令
-
- 管道符及grep命令
1.管道命令的基本概念
-
-
-
- 在Linux系统中"|"表示管道符,用它来讲两个命令隔开
- 管道符左边命令的输出会作为管道符右边命令的输入
- 连续使用管道符就表示第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三命令的输入,以此类推
-
-
2.grep命令
-
-
-
- 查看源系统解释可知grep命令,是通过正则表达式搜索对应的文件或者是打印出来通过正则表达式匹配到的内容
-
-
3.示例
将ls查询到的信息传递给grep命令进行搜索匹配文件夹名包含"ba"的内容
-
- find命令
1.find命令的功能
find命令能够在一个目录中搜索文件,可以指定匹配条件,比如按文件名,文件类型等
2.find命令及其常用选项
语法格式: find [目录路径] [选项] 参数
常用选项:
-
- sed命令
1.sed的基本概念
-
-
-
- sed是非交互式文本处理工具,在默认情况下,sed将所有输出的行打印到屏幕上
- sed可以通过数据重定向的方式,将输出的内容保存到某个文件里
-
-
2.sed逐行处理文件,并将结果发送到屏幕的具体过程
-
-
-
- sed把当前正在处理的行保存在一个临时缓冲区
- 然后处理临时缓冲区中的行,完成后把该行发送到屏幕上
- sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示
- 处理完输入文件的最后一行,sed变结束运行
- sed把每一行都存在临时缓冲区中,然后对缓冲区这个副本进行编辑,所以源文件不会发生改变
-
-
3.sed命令的应用
语法格式: sed [选项] "[动作]" fileName
常用选项:
特殊选项:
示例:修改源文件,同时想要修改后的源文件的内容显示在屏幕上
常用动作:
示例:sed "s/baiduhadoop/hadoop/g" demo.txt
注意:
想要修改源文件的内容,使用选项-i即可:sed -i "s/baiduhadoop/hadoop/g" demo.txt
如果向输出到其他文件里:sed "s/baiduhadoop/hadoop/g" demo.txt > demo1.txt
示例:应用多条sed的动作进行文件内容的修改
方式1,通过-e选项:sed -e "s/h/H/g" -e "s/o/O/g" fileName
方式2,通过在引号中添加分号的形式:sed "s/h/H/g;s/o/O/g" fileName
-
- sort命令
1.sort命令的作用
-
-
-
- sort是将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较
-
-
2.sort命令及其选项
语法格式: sort [选项] 参数
常用选项:
3.示例
默认排序:
指定的四段进行排序:
-
- cut命令
1.cut命令的作用
cut命令在文件中负责剪切数据用的,但是数据必须是有规则的数据
2.cut命名及其常用选项
语法格式: cut [选项] [参数] fileName
常用选项:
示例:
示例:剪切每一行的第5个到第7个字节
示例:剪切每一行第6个字节之后的内容
示例:剪切每一行,第6个字节之前的内容
-
- history历史命令
1.history命令的作用
该命令用于显示历史执行过的所有命令
2.历史命令的一些执行命令
6.2 shell高级-脚本
6.2.1 shell script概述
-
- shell script的基本概念
1.什么是shell script
shell script就是以固定语法组织起来的存文本文件
可以编译这个文件,让文件帮助我们一次执行多条命令
可以通过一些运算与逻辑判断来达成较为复杂的功能
2.shell script的注意事项
命令的执行是从上而下,从左到右执行的
命令、选项和参数间的多个空格会被忽略
空白行也被忽略掉,tab被当成空格
"#"后面的内容为注释,不会执行
如果读取一个Enter符号,就会尝试开始执行该行命令
-
- shell script如何执行
1.直接执行
假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))
通过绝对路径:运行/home/shell.sh
通过相对路径:先cd到/home/,使用./shell.sh 执行
2.通过source执行
假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))
语法格式:source /home/shell.sh
3.通过sh执行
假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))
语法格式:sh /home/shell.sh
6.2.2 shell脚本的编写
-
- 编写一个交互式脚本
1.提示用户输入两个数字,然后对这两个数字进行相乘,给用户返回结果
#!/bin/bash
#告诉用户本程序的功能,并且引导用户进行内容的输入
echo "您好,请输入两个数字,我将对这两个数字进行乘法运行,给您返回结果!"
#引导用户输入
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
#计算结果,并返回
mul=$(($num1*$num2))
echo "您输入的两个数字${num1}*${num2}的结果是${mul}"
代码执行的结果:
以上脚本解析:
-
-
-
- 第一行#!/bin/bash,告诉系统如何执行脚本。当采用直接执 行(不是用类似sh xxx.sh这样的方式)时,此行必须有,且要放在首行。
- 除了第一行的之外#都是注释,其他为程序部分。
- read -p "提示信息" 变量名,用于给客户进行信息提示,用户输入的结果作为变量的值
- echo 后面为返回值,返回到屏幕
-
- test判断命令
-
1.test命令及其选项
语法格式:test [选项] 参数
常用选项:
2.test判断字符串
常用的字符串的判断
3.编写一个脚本,判断文件时那种类型,具有哪些权限
#!/bin/bash
#先给予提示
read -p "请输入一个文件名,将对其判断文件类型及其权限" fileName
#是否输入了文件名,如果为空,进行提示,并提示脚本
test -z $fileName&&echo "您必须输入一个文件名" && exit 1
#判断文件/目录是否存在?不存在则结束脚本
test !-e $fileName && exit 2
#判断文件类型及其统计文件具有哪些权限
test -f $fileName && filetype="文件"
test -d $fileName && filetype="目录"
test -r $fileName && fileperm="读"
test -w $fileName && fileperm="${fileperm}-写"
test -x $fileName && fileperm="${fileperm}-执行"
#输出文件类型和文件所有的权限
echo "您输入${fileName}的类型是${filetype},它具备的权限是${fileperm}"
-
- [ ]判断符号
1.[]判断符号的作用
[]符号比较字符串,里边可用的符号:
==:等于
!=:不等于
[]符号中的逻辑判断:
-a:逻辑与
-o:逻辑或
[]符号比较数字,里边可用的符号:
2.注意点:
在使用[]判断符的时候,一定要注意[]符号两边空格的使用,[]符号里边两边应保留一个空格
[]符号中不能使用:&&,||,>,<
6.2.3 shell script的参数
-
- 脚本参数的的标识
1.脚本参数的标识符
常用的脚本参数的标识符
2.编写一个脚本,查看各个标识的含义
#!/bin/bash
echo "the script name is==>$0"
echo "total parameter number is==>$#"
[ "$#" -lt 2 ]&&echo "the number of parameter is lt 2"&&exit 1
echo "1st parameter==>$1"
echo "2nd parameter==>$2"
echo "your whole parameter is==$@"
exit 0
代码执行结果:
注意:此方式是脚本后面直接接参数传递给脚本,这些参数就被当做脚本的变量来使
3.编写一个脚本,体现$@和$*的不同点
#/bin/bash
for i in "$*";do
echo $i
done
echo "============="
for i in "$@";do
echo $i
done
代码执行结果:
由以上结果可知:
$@和$*都是获取所有的参数数据,但是$@获取的每一个参数是独立的
$*获取的所有参数变成了一个整体
-
- shift参数变量号码的偏移
1.shift的作用
shift是用于偏移脚本的参数的,通常是用于参与执行过程的参数的"删除"
这里的"删除"不是真的删除,而是将对应的参数标记,从而不去执行它
例如:执行命令ls -a -R -l -h -d
第一次执行的时候-a参数被执行,下一次执行ls的时候,-a参数不再参加执行就需要将它偏移
即在程序中执行一次"shift"
2.编写脚本,展示shift的用法
#!/bin/bash
echo "total parameter number is==>$#"
echo "your whole parameter is==>$@"
#shift one parameter
shift
echo "total parameter number is==>$#"
echo "your whole parameter is==>$@"
#shift three parameter
shift 3
echo "total parameter number is==>$#"
echo "your whole parameter is==>$*
代码执行结果:
6.2.4 shell script的条件判断语句
-
- if条件判断语句
1.if条件判断语句语法格式
语法格式1:
if [ 条件判断 ]
then
//条件成立执行命令
fi
语法格式2:
if [ 条件判断 ];then
//条件成立执行命令;
fi
2.编写脚本,判断两个数的大小
将参数写死在脚本中
#!/bin/bash
#比较两个数的大小
a=2
b=3
if [ $a -gt $b ]
then
eche "$a>$b"
fi
if[ $a -le $b ];
then
echo "$a<=$b"
fi
通过用户输入的值来判断
#!/bin/bash
read -p "请输入两个数,用于判断他们的大小:" a b
if[ $a -gt $b ];then
echo "$a>$b"
fi
if[ $a -le $b ];then
echo "$a<=$b"
fi
通过用户传参的方式来判断
#!/bin/bash
if[ $1 -gt $2 ];then
echo "$1>$2"
fi
if[ $1 -le $2 ];then
echo "$1<=$2"
fi
-
- if else条件判断语句
1.if else条件判断语句语法格式
语法格式1:
if [ 条件1 ];then
条件1成立执行,指令集1
else
条件1不成执行指令集2;
fi
语法格式2:
if [ 条件1 ];then
条件1成立,执行指令集1
elif [ 条件2 ];then
条件2成立,执行指令集2
else
条件都不成立,执行指令集3
fi
6.2.5 shell script循环语句
-
- while循环语句
1.不定循环while循环的语法
语法格式1:
while [ condition ];do
命令
done
语法格式2:
while [ condition ] do 命令 done
-
- for循环语句
1.for……do……done循环语法结构
语法格式:
for 变量名 in 变量取值列表
do
命令
done
2.for循环中,变量取值列表可以多样化,特殊的可以使用命令的值来替代
-
- sh脚本语法的检查
1.脚本语法正确性的检查
刚开始学脚本,经常会遇到语法问题,运行有错误的脚本有时候会对系统产生一些影响
可以通过sh命令来检查语法的正确性
语法格式:sh [选项]
2.注意点:
-n选项不执行script,仅仅是检查语法的问题
-v选项在执行script之前,先将script的内容输出到屏幕上
-x选项将使用到的script内容显示到屏幕上