Linux之Shell编程
3.Shell编程
1.shell是什么
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止一些程序。
2. shell脚本的执行方式
-
脚本格式要求
-
1.脚本以#!/bin/bash开头
-
2.脚本需要可执行权限
-
-
编写一个shell脚本,输出hello shell
-
mkdir /root/shcode
-
cd /root/shcode
-
vim hello.sh
-
输入
#!/bin/bash
echo "hello shell "
-
-
脚本的常用执行方式
-
方式1:(输入脚本的绝对路径或相对路径)
-
说明:首先要赋予helloshell.sh脚本的 +x 权限,
-
再执行脚本
chmod u+x hello.sh
-
./hello.sh
或者/root/shcode/hello.sh
-
-
方式2:(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。
sh hello.sh
-
3.shell的变量
-
shell变量介绍
1.Linux shell 中的变量分为,系统变量和用户自定义变量。2.系统变量:
$HOME $PWD $SHELL $USER
3.显示当前shell中所有变量:
set
-
shell变量的定义
-
基本语法
1.定义变量:变量名=值
2.撤销变量:
unset 变量
3.声明静态变量:
readonly 变量
,但是不能unset
-
-
案例
-
案例1:声明变量A
vim var.sh
#!/bin/bash
A=100
echo "A=$A"
-
案例2:撤销变量A
unset A
-
案例3:声明静态的变量B,不能unset
readonly B
-
-
shell变量的定义
-
定义变量的规则
1.变量名称可以由字母、数字、和下划线组成,但是不能以数字开头。 5A=100 (x)2.等号两侧不能有空格
3.变量名称一般习惯为大写,这是一个规范
-
将命令的返回值赋给变量
1.A=date
反引号, 运行命令,并把结果返回给变量A2.
A=$(date)
等价于反引号
-
4.设置环境变量
-
基本语法
-
export 变量名=变量值
功能描述:将shell变量输出为环境变量/全局变量 -
source 配置文件
功能描述:让修改后的配置信息立即生效 -
echo $变量名
功能描述:查询环境变量的值
-
-
案例
- 在/etc/profile文件中定义TOMCAT_HOME环境变量
.... - 查看环境变量TOMCAT_HOME的值
.... - 在另一个shell程序中使用 TOME_HOME
....
- 在/etc/profile文件中定义TOMCAT_HOME环境变量
-
注意:
在输出TOMCAT_HOME环境变量前,需要让其生效
source /etc/profile
-
shell脚本的注释
-
shell脚本单行注释 采用
#
开头 -
shell脚本多行注释 :
<<! 多行注释内容 !
-
5.位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
比如: ./myshell.sh 100 200
这就是一个执行shell的命令行,就可以在myshell脚本中获取到参数信息
-
基本语法
1.$n
功能描述:n为数字,$0
代表命令本身,$1-$9
代表第一到第九个参数,十以上的参数需要使用大括号包含,如${10}
2.
$*
功能描述:这个变量代表命令行中的所有参数 ,此命令把所有参数看成一个整体3.
$@
功能描述:这个变量也代表命令行中的所有的参数,但是此命令把每个参数区分对待4.
$#
功能描述:这个变量代表命令行中的所有参数的个数 -
位置参数变量
- 案例:编写一个shell脚本position.sh,在脚本中获取到命令行的各个参数信息
-
#!/bin/bash
-
echo "0=$0 1=$1 2=$2"
-
echo "所有的参数=$*"
-
echo "$@"
-
echo "参数的个数=$#"
-
执行
sh position.sh 100 200
-
输出结果
- 0=./position.sh 1=100 2=200
- 所有的参数=100 200
- 100 200
- 参数的个数=2
-
- 案例:编写一个shell脚本position.sh,在脚本中获取到命令行的各个参数信息
6.预定义变量
就是shell脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用
-
基本语法
-
$$
功能描述:当前进程的进程号(PID) -
$!
功能描述:后天运行的最后一个进程的进程号(PID) -
$?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体的数字由命令本身来决定),则证明上一条命令执行不正确。
-
-
应用案例
在一个shell脚本中简单使用预定义变量
prevar.sh
7.运算符
-
基本语法
-
"$((运算式))"
或"$[运算式]"
推荐使用 或者expr m + n
-
注意
expr
运算符间要有空格 -
expr m-n
-
expr \*, / , %
乘,除,取余
-
-
应用实例
-
案例1:计算(2+3)*4
1.$(((2+3)*4))
2.
$[(2+3)*4]
3.
TEMP=
expr (2 + 3)`4.
RES=
expr TEMP * 4`` -
案例2:求出命令行的两个参数[整数]的和
-
vim oper.sh
-
#!/bin/bash
-
SUM=$[$1+$2]
-
echo "sum=$SUM"
-
./oper.sh 20 50
-
-
8.条件判断
-
判断语句
-
基本语法
[ condition ]
注意condition前后要有空格非空返回
true
,可使用$?
验证(0为true
,>1为false
)
-
-
应用实例
[] true
[] false
[ condition ] && echo OK || echo notok
条件满足,执行后边语句 -
常用判断条件
-
=
字符串比较 -
两个整数的比较
-lt
小于-le
小于等于 little equal-eq
等于-gt
大于-ge
大于等于-ne
不等于 -
按照文件权限进行判断
-r
有读的权限-w
有写的权限-x
有执行的权限 -
按照文件类型进行判断
-f
文件存在并且是一个常规的文件-e
文件存在-d
文件存在且是一个目录
-
-
使用案例
-
案例1: 判断"ok" 是否等"ok"
判断语句
=
-
案例2: 23是否大于等于22
判断语句
-ge
-
案例3: /root/shcode/aaa.txt目录中的文件是否存在
判断语句
-f
-
9.流程控制
-
if判断
- 基本语法
-
if [条件判断式] then 代码 fi
-
if [条件判断表达式] then 代码 elseif [条件判断表达式] 代码 fi
-
[ 条件判断式 ] ,中括号和条件判断式之间必须有空格
-
- 基本语法
-
应用实例 ifcase.sh
编写shell程序,如果输入的参数大于等于60,输出及格了,如果输入小于60,输出不及格。#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
-
case语句
- 基本语法
-
case $变量名 in "1")
如果变量的值等于值1,则执行程序1
-
;; "2")
如果变量的值等于值2,则执行程序2
-
;; "* ")
如果变量的值都不是以上的值,则执行此程序
-
;; esac
-
- 基本语法
-
应用案例
当命令行参数是1时,输出周一,当是2时,输出周二,其他情况输出other
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
-
for 循环
-
基本语法1
for 变量 in 值1 值2 值3 ... do 程序/代码 done
-
基本语法2
for ((初始值;循环控制条件;变量变化)) do 程序 done
-
-
while循环
-
基本语法1
while [ 条件判断式 ] do 程序 done
-
10.read读取控制台输入
-
基本语法
read(选项)(参数)
-
选项
-p
功能:指定读取值时的提示符;-t
功能:指定读取值时等待的时间(秒),如果没有在指定的时间输入,就不再等待了。 -
参数
变量: 指定读取值的变量名
-
-
应用实例 testRead.sh
案例1:读取控制台输入一个num值
案例2:读取控制台输入一个num值,在10秒内输入
#!/bin/bash
read -p "请输入一个数NUM1=" NUM1
echo "你输入的数NUM1=$NUM1"
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的数NUM2=$NUM2"
11. 函数
shell编程和其他编程语言一样,有系统函数,也可以自定义函数。
-
系统函数
-
basename基本语法 功能:返回完整路径最后/的部分,常用于获取文件名
basename pathname suffix
basename string suffix
功能描述:basename命令会删掉所有的前缀包括最后一个‘/‘
字符,然后将字符串显示出来。选项:
suffix
为后缀,如果指定了suffix,basename会将pathname或string中的suffix去掉
-
-
应用实例
请返回/home/aaa/test.txt的test.txt的部分指令:
basename /home/aaa/test.txt
执行结果: test.txtbasename /home/aaa/test.txt .txt
执行结果:
test
-
dirname基本语法
功能:返回完整路径最后/的前面的部分,常用于返回路径部分dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)应用案例
案例1:请返回/home/aaa/test.txt的/home/aaa指令:
dirname /home/aaa/test.txt
-
自定义函数
-
基本语法
[function] funname[()] { action; [return int;] }
-
调用直接写函数名 funname [值]
-
应用实例
1. 计算输入两个参数的和,getSum#!/bin/bash
#计算输入两个参数的和,getSum
# 定义函数getSum
function getSum()
{
SUM=$[ $n1+$n2 ]
echo "和是=$SUM"
}
#输入两个值
read -p "请输入一个值n1=" n1
read -p "请输入一个值n2=" n2
-