一、为什么要学习Shell编程
- Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
- 对于JavaEEhe Python程序员来说,是工作的需要,如要求编写一些Shell脚本进行程序或服务器的维护。
- 对于大数据程序员来说,需要编写Shell程序来管理集群。
二、Shell是什么
- Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
三、Shell脚本的快速入门
3.1 脚本格式要求
- 脚本以
#!/bin/bash
开头 - 脚本需要有可执行权限
3.2 编写第一个Shell脚本
- 创建一个Shell脚本,输出一个Hello world
- 步骤如下:
- 先创建一个
myshell.sh
文件,并输入命令
- 赋予可执行权限
- 执行,相对路径和绝对路径都可以
四、Shell变量
4.1 Shell变量的介绍
- Linux Shell变量分为:系统变量和用户自定义变量
系统变量:
$HOME
$PWD
$SHELL
$USER
- 显示当前shell中所有的变量:
set
4.2 Shell变量的定义
4.2.1 基本语法
- 定义变量:
变量=值
- 撤销变量:
unset 变量
- 声明静态变量:
readonly 变量=值
(静态变量是不能unset
的)
4.2.2 定义变量的规则
- 变量名称可以由字母、数字、下划线组成,但是不能以数字开头
- 等号两侧<font color="red">不能有空格</font>
- 变量名称一般习惯为大写
4.2.3 将命令的返回值赋给变量
- A=
ls -l 目录名
。反引号(这里编程代码块了) A=$(ls -l 目录名)
,$
等价于反引号
4.3 设置环境变量
4.3.1 基本语法
export 变量名=变量值
:将shell变量输出为环境变量source 配置文件
:让修改后的配置信息立即生效echo $变量名
:查询环境变量的值
4.3.2 快速入门
- 在
/etc/profile
文件中定义TOMCAT_HOME
环境变量 查看环境变量
TOMCAT_HOME
的值- 让其生效才能查看:
source /etc/profile
- 让其生效才能查看:
- 在另外一个shell程序中使用
TOMCAT_HOME
- linux中的多行注释
:<<要注释的内容!
4.4 位置参数变量
4.4.1 介绍
当执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
- 如:
./myshell.sh 100 200
,可以在myshell
脚本中获取到这个命令行所包含的信息
- 如:
4.4.2 基本语法
$n
:n为数字,$0
代表命令本身,$1
-$9
代表第一到第九个参数,十以上的参数,需要用大括号包含,${10}
$*
:这个变量代表命令行中所有的参数,<font color="red">把所有的参数看做一个整体</font>$@
:这个变量也代表命令行中的所有参数,<font color="red">把每个参数区分对待</font>$#
:这个变量代表命令行中所有参数的个数
4.4.3 应用实例
- 编写一个shell脚本positinoPara.sh,在脚本中获取到命令行的各个参数信息
4.5 预定义变量
4.5.1 基本介绍
- shell事先已经定义好的变量,可以直接在shelle脚本中使用
4.5.2 基本语法
$$
:当前进程的进程号(PID)$!
:后台运行的最后一个进程的进程号(PID)$?
:最后一次执行的命令的返回状态。- 如果这个变量的值为0,证明上一个命令正确执行;
- 如果这个变量的值为非0,则证明上一个命令执行不正确。
4.6 运算符
4.6.1 基本介绍
- 在shell中进行运算操作
4.6.2 基本语法
$((运算式))
或$[]
expr m + n
- 注意expr运算符间要有空格
\*
/
%
:乘、除、取余
4.7 条件判断
4.7.1 判断语句 基本语法
[ condition ]
:condition前后都要有空格- 非空返回
true
,可使用$?
验证(0为true
,>1为false
)
- 非空返回
- 应用实例
[ nihao ] | true |
---|---|
[ ] | false |
4.7.2 常用判断条件
两个整数的比较
=
:字符串比较-lt
:小于-le
:小于等于-eq
:等于-gt
:大于-ge
:大于等于-ne
:不等于
按照文件权限进行判断
-r
:有读的权限-w
:有写的权限-x
:有执行的权限
按照文件类型判断
-f
:文件存在并且是一个常规的文件-e
:文件存在-d
:文件存在并且是一个目录
4.7.3 应用实例
- "ok"是否等于“ok”
- 23是否大于等于22
/root/install.log
目录中的文件是否存在
4.8 流程控制
4.8.1 if 判断
- 基本语法
if[ 条件判断式 ]
then
程序
elif[ 条件判断式 ]
then
程序
fi
- 注意:
[ 条件判断式 ]
中条件判断式两边都有空格
4.8.2 case 语句
- 基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
"值3")
如果变量的值等于值3,则执行程序3
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
4.8.3 for循环
- 基本语法1
for 变量 in 值1 值2 值3
do
程序
done
- 基本语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
4.8.4 while循环
- 基本语法
while [ 条件判断式 ]
do
程序
done
4.9 read读取控制台输入
4.9.1 基本语法
read [选项] [参数]
选项:
-p
:指定读取值时的提示符-t
:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待
参数:
变量名
:指定读取值的变量名
4.10 函数
4.10.1 函数介绍
- shell编程和其他编程语言一样,有系统函数,也可以自定义函数。
4.10.2 系统函数
basename
基本语法1:
basename [pathname] [suffix]
- 功能:返回完整路径最后
/
的部分,常用于获取文件名;若指定后缀,就会把后缀删除
- 功能:返回完整路径最后
dirname
基本语法:
dirname [pathname]
- 功能:返回完整路径最后
/
的前面部分,常用于返回路径部分
- 功能:返回完整路径最后
4.10.3 自定义函数
- 基本语法
[function] funname[()]
{
Action;
[return int;]
}
- 调用直接写函数名:
funname[值]