shell编程学习笔记教程
shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统程序,可以用shell来启动、挂起、停止、编写一些程序。
快速入门
- 脚本格式要求
- 脚本以#!/bin/bash开头
- 脚本需要有可执行权限
- 编写一个shell脚本输出hello world
- 新建一个myShell.sh脚本
编辑脚本内容
![shell编程学习笔记教程](https://www.icode9.com/i/ll/?i=img_convert/7853e2f97493349b0c4a0e33019f6fae.png)
赋予脚本执行权限
![shell编程学习笔记教程](https://www.icode9.com/i/ll/?i=img_convert/4576716355c09d4cd9708772600ae10c.png)
![shell编程学习笔记教程](https://www.icode9.com/i/ll/?i=img_convert/7e068b148f946c425f5bad91bac0b5a4.png)
- 脚本的常用执行方式
输入脚本的绝对路径或相对路径
![shell编程学习笔记教程](https://www.icode9.com/i/ll/?i=img_convert/8c5b77e0c7b2abd3411c611217223cca.png)
sh+脚本
说明:这种方式可以不用赋予脚本可执行权限,直接运行即可
![shell编程学习笔记教程](https://www.icode9.com/i/ll/?i=img_convert/e525fe372165aad4a6e3c85db87673ce.png)
shell变量
shell变量分为,系统变量和用户自定义变量。系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER等。
系统变量
- 输出系统变量
注:使用$引用变量
- 显示shell中的所有变量:set
用户变量
- 语法
- 定义变量:变量名=变量值
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量。静态变量不能unset
- 定义变量规则
- 变量名称可由字母、数字和下划线组成,数字不能开头
- 等号两侧不能由空格
- 变量名一般习惯为大写
- 将命令的返回值赋值给变量
- A=
ls -la
反引号,运行引号里面的命令,并将结果返回给变量A - A=$(ls -la)
- 案例一:声明用户变量
- 案例二:静态变量不能unset
- 案例三:引用命令运行结果
设置环境变量
- 语法
- export 变量名=变量值(将shell变量输出为环境变量)
- source 配置文件(使修改后的配置文件生效)
- echo $变量名(查询环境变量的值)
- 案例
位置参数变量
当执行shell脚本时,希望获取到命令行的参数,就可以使用位置参数变量。比如,./myShell.sh 100 200,这个shell命令,可以在shell脚本中获取到参数信息。
- 语法
$n:n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 第 十 个 以 上 的 参 数 , 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,第十个以上的参数,需要用大括号包含,如 9代表第一到第九个参数,第十个以上的参数,需要用大括号包含,如(10)
$*:代表命令中的所有参数,把所有参数看成一个整体
$@:代表命令中的所有参数,把每个参数区分对待
$#:代表命令中所有参数的个数
- 案例
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
- 语法
$$:表示当前进程的进程号(PID)
$!:表示后台运行的最后一个进程的进程号(PID)
$?:表示最后一次执行的命令的返回状态,0代表上一个命令正常执行,非0则代表上一个命令执行不正确
- 案例
运算符
- 语法
- ( ( 运 算 符 ) ) 或 ((运算符))或 ((运算符))或[运算符]
expr m + n
注意:expr运算符间要有空格。
- expr /*,/,% 乘,除,取余,乘要“/”转义
- 案例
条件判断
- 基本语法
[ condition ] (注意condition前后又空格)
\#非空返回true,可使用$?验证(0-true,>1-false)
- 判断语句
两个整数判断
=:字符串比较
-lt:小于
-le:小于等于
-eq:等于
-gt:大于
-ge:大于等于
-ne:不等于
按照文件权限判断
-r 文件:有读的权限
-w 文件:有写的权限
-x 文件:有执行权限
按照文件类型判断
-e 文件:判断文件是否存在
-d 文件:文件存在且是一个目录
- 案例
流程控制
if
- 语法形式1
if [ 条件判断 ];then
程序
fi
- 语法形式2
if [ 条件判断 ]
then
程序
elif [ 条件判断 ]
then
程序
fi
- 注意:[ 条件表达式 ],中括号和条件表达式之间必须有空格
- 案例
case
- 语法
case $变量名 in
"value1")
如果变量值等于value1则执行
;;
"value2")
如果变量值等于value1则执行
;;
*)
如果变量值都不等于以上的值,则执行此程序
;;
esac
- 实例
for循环
- 语法1
for 变量 in 值1 值2 值3 ...
do
程序
done
- 语法2
for((初始值;循环控制条件;更新变量))
do
程序
done
- 实例
while循环
- 语法
while [ 条件表达式 ]
do
程序
done
- 实例
read读取控制台输入
- 语法
read [选项] [参数]
- 选项
-p:指定读取时的提示符
-t:指定读取等待时间(秒),如果没有在指定时间内输入,就不再等待
- 参数
变量:指定读取值的变量名
- 实例
函数
shell既有系统函数,也可以自定义函数。
系统函数
- basename
- basename [path] [suffix] 功能:返回完整路径最后/的部分,常用于获取文件名
- basename [string] [suffix] 功能:删掉所有的前缀包括最后一个“/”字符,然后将字符串显示出来
选项:suffix为后缀,如果suffix指定了,basename会将pathname或string中的suffix去掉。
- 实例
- dirname
dirname 文件绝对路径
功能:返回完整路径最后/的前面部分,常用于返回文件路劲
- 实例
自定义函数
- 语法
function funName()
{
函数体;
[return int;]
}
调用直接写函数名:funname[值]
- 实例
]
- dirname
dirname 文件绝对路径
功能:返回完整路径最后/的前面部分,常用于返回文件路劲
- 实例
[外链图片转存中…(img-usOvTRhb-1612708535084)]
自定义函数
- 语法
function funName()
{
函数体;
[return int;]
}
调用直接写函数名:funname[值]
- 实例