一、为什么要学习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[值]
