Shell基础
-
Shell:是Linux命令解释器;它是用户与系统内核,之间交互的桥梁;
-
Shell-Script(脚本):一种解释型语言;也是命令式语言;作用是可以批量执行命令,实现一些自动化任务,例如一键安装脚本、自动发送邮件、短信、微信、钉钉、系统巡检脚本、系统优化脚本,数据库备份脚本、垃圾清理脚本等。
总结:
什么时候用到脚本? 重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
①自动化分析处理 ②自动化备份 ③自动化批量部署安装 ④等等…
开发环境:
-
Linux+vim+可选插件
-
vscode+插件
-
本地安装
-
远程访问(ssh)
-
dpkg -i code的下载地址
-
安装vscode:在浏览器下载后,用dpkg -i 文件路径。
执行脚本的方式:
①/bin/sh 脚本文件或者/bin/bash 脚本文件
②bash 脚本文件或者sh 脚本文件
③./脚本文件
如果权限不够就先chmod +x 脚本
学Shell脚本学什么
-
基础语法:
-
变量
#输入 #!/bin/bash a=100 echo $a #会输出 100 -
输入、输出
# 输入 #!/bin/bash echo "Hello shell!" #输出双引号中的字符串 read "xxx" #输入字符串xxx # 会输出 Hello shell! -
判断
-
循环
-
函数
-
数组
-
Linux命令,重点三剑客(awk,grep,sed),运算,数据处理,计划任务
-
写脚本:
-
案例模仿
-
照着文档改写
-
复杂任务,需求分析,需求拆分,编写模块
shell基础语法
变量
变量:数据的别名,创建变量时,会在内存中开辟存储空间,将数据存入内存中,将变量名与内存地址绑定
变量命名规范:
-
不要和命令相同,建议使用大写字母;
-
使用数字、字母、下划线命名,不要以数字开头;
-
Shell变量赋值时,“=”等于号前后不能有空格(且变量名不加$) ;
-
蛇形命名:my_name(用下划线代替空格,不要用减号);
-
驼峰命名:小驼峰myName,getAge,setMoney(小写开头)
大驼峰MyName(大写开头)
-
MYSQL_PATH,MYSQL_PROT
三种引号:
-
单引号:输出的是字符串本身;(里面的变量无效)
-
双引号:当包含$变量时,会输出变量的值;(可以出现转义字符)
-
反引号:引用命令,以字符串方式返回命令的执行结果;
举例说明 # 输入 #!/bin/bash MY_PATH=/usr/local/xxx echo $MY_PATH echo '$MY_PATH' echo "$MY_PATH" echo "今天的日期是:`date +%Y-%m-%d`" #会输出 /usr/local/xxx $MY_PATH /usr/local/xxx 今天的日期是:2025-09-02
连接Ubuntu的vscode的ssh(上传远程仓库):
左下角远程连接——连接主机——root@192.168.221.129——连接——输入密码,回车——密码,回车——打开文件夹——/home/cqh/code
或者通过访问以下网址来访问脚本:
[hello.sh · juanxincai/yun11 - 码云 - 开源中国](https://gitee.com/fbdrn/yun11/blob/master/hello.sh)
如何把改动上传仓库?
# 去远程仓库克隆/下载那里复制码到/home/cqh/code目录下
git clone https://gitee.com/fbdrn/yun11.git
# 出现下面这个就是克隆完成
正克隆到 'yun11'...
接收对象中: 100% (23/23), 4.67 KiB | 955.00 KiB/s, 完成.
# 查看yun11目录是否克隆到code目录下
ls
# 进入yun11目录下
cd yun11/
ls
hello.sh README.md test1.txt
# 上传同步,把修改的脚本文件复制到yun11下
cp haha.sh ./yun11
git add .
git commit -m ""
git push
# 然后就会上传到源代码管理(分支图标:第三个树枝一样的图形里会出现①)
在框里输入备注然后提交——如果要上传仓库的话就同步——用户名是fbdrn,密码是私有令牌a61933dab2a9eb31aafc49ea0c0c0d2b(如果有公钥可以不用输入这一步)
课堂案例:
# 输入
MY_PATH=/usr/local/xxx
echo '$MY_PATH'
echo "APP的地址是$MY_PATH"
echo `ip a | grep inet | sed -n '3p' | awk '{print $2}' | awk -F"/" '{print $1}'`
MYIP=`ip a | grep inet | sed -n '3p' | awk '{print $2}' | awk -F"/" '{print $1}'`
echo "我的ip地址是:$MYIP"
# 输出
cqh@cqh-virtual-machine:~/code$ bash ./hello.sh
$MY_PATH
APP的地址是/usr/local/xxx
192.168.221.129
我的ip地址是:192.168.221.129
变量分类
普通变量
普通变量:在Shell运行时子Shell中生效;只在当前shell中生效,环境变量是全局生效
# 输入
MY_NAME="chen"
echo $MY_NAME或echo $(MY_NAME)
# 输出
chen
# 删除变量
unset MY_NAME
# 只读变量(不能被删除)
readonly MY_NAME
全局变量(自定义环境变量)
全局变量:export 变量名;(临时生效,重启无效)
①bash:在运行脚本时,会启动一个子Shell执行脚本命令
②source:加载,在当前的父Shell中执行,也就是让脚本里面的命令在当前终端执行
③chmod +x test.sh
./test.sh # ./其实是调用了/bin/bash/test.sh
. test.sh # . 等价于source
# 输入
export MY_NAME="juan"
echo "$MY_NAME"
# 输出
juan
如果想要永久生效,需写入以下配置文件中:
对当前用户:~/.bashrc ~/.profile ~/.bash_profile
对所有用户:/etc/profile
系统环境变量
系统环境变量:env 查看当前Shell的环境变量,如 PATH(命令搜索路径)、HOME(当前用户家目录)、SHELL(默认 Shell 类型)、PWD(当前工作目录)、USER/LOGNAME(当前登录用户名)、LANG(系统语言和编码设置)、TERM(终端类型)。
export PATH=$PATH:/usr/local/mysql/bin # 表示在原有 PATH的基础上,新增 /usr/local/mysql/bin目录,将 “局部变量” 提升为 “环境变量”
# 所有用户开机生效
vim /etc/profile
# 让当前用户开机生效
vim ~/.bash_profile | ~/.bashrc | ~/.profile
| 命令 / 文件 | 作用 | 生效范围 | 加载时机 |
|---|---|---|---|
env | 查看当前环境变量 | 仅当前终端 | 实时执行 |
export ... | 临时修改环境变量 | 仅当前终端 | 实时执行,重启失效 |
/etc/profile | 永久配置系统级变量 | 所有用户 | 登录时加载 |
~/.bash_profile | 永久配置当前用户登录变量 | 仅当前用户 | 登录时加载 |
~/.bashrc | 永久配置当前用户终端变量 | 仅当前用户 | 新建终端时加载 |
~/.profile | 兼容型用户登录配置 | 仅当前用户 | 登录时加载(备用) |
内置变量(特殊变量)★★★
echo :$?,$0,$1~$9,$!,$@,$*,$#
| 参数 | 含义 |
|---|---|
| $? | 上一条命令执行是否成功,成功返回0,失败返回其他数字 |
| $0 | 执行脚本时获取的当前脚本的名称 |
| $1~$9 | 显示选项或者参数,第1~第9个参数 |
| $@ | 获取脚本后面所有参数,参数是独立的(竖着输出 "1" "2" "3"),也是全部输出 |
| $* | 获取脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开,这俩都要用双引号引起来("1 2 3") |
| $# | 获取脚本后面接的参数的数量 |
| $! | 获取后台运行程序的PID (!!是查看当前终端,$$是脚本运行的最后一个进程的ID号),把进程号保存下来,可以通过kill -9杀死这个进程 |
| $- | 显示 Shell 使用的当前选项,与 set 命令功能相同。 |
!!注意:$(命令)等价于命令,获取命令的执行结果
| 变量类型 | 定义方式 | 作用范围 | 典型用途 |
|---|---|---|---|
| 普通变量 | name=value | 当前 Shell / 脚本(局部) | 临时数据存储 |
| 自定义环境变量 | export name=value | 当前 Shell 及子进程(全局) | 父子进程间传递数据 |
| 系统环境变量 | 系统预定义,用env查看 | 全局(所有进程) | 系统配置(路径、语言等) |
| 特殊变量 | Shell 预定义 | 脚本 / 命令行中自动生效 | 命令行参数、进程状态等 |
转义字符
| \n | 换行符 |
|---|---|
| \t | 制表符 |
| \a | 响铃符 |
| \r | 回车符,将光标移动到一行的开头 |
echo
功能:将内容输出到默认的显示设备
-e 意思是可以识别转义字符
-n 不换行
## 识别转义字符
# 输入
echo -e "hello\nworld!"
# 输出
hello
world!
输出颜色字体
第一种方法:
color_start="\033[31m"
color_end="\033[1m"
echo -en "\r$color_start`date +"%H:%M:%S"`$color_end"
第二种方法:
# 字体颜色
for i in {31..37}; do
echo -e "\033[$i;40mHello world!\033[0m"
done
# 背景颜色
for i in {41..47}; do
echo -e "\033[47;${i}mHello world!\033[0m"
done
# 显示方式
for i in {1..8}; do
echo -e "\033[$i;31;40mHello world!\033[0m"
done
第一种:{1..10} {a..z} {A..F}范围循环
第二种:命令 ${命令}
## 死循环电子时钟
while true
do
echo -en "\r"`date + "%H:%M:%S"`
echo -en "\r$color_start`date +"%H:%M:%S"`$color_end"
sleep 1
done
# 循环数字
for i in {0..9}
do
echo $i
done
# 循环命令的执行结果(每行一个显示)
for i in `ls/`
do
echo $i
done
## 九九乘法表第一种方法
j=1
for i in {1..9}
do
for j in `seq 1 $i`
do
echo -en "$i x $j = $(( $i*$j ))\t"
done
echo ""
done
## 九九乘法表第二种方法
for (( i=1;i<=9;i++ ))
do
for (( j=1;j<=$i;j++ ))
do
echo -en "$i x $j = $(( $i*$j ))\t"
done
echo ""
done
shell数值运算
Shell 算术运算符
Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。
原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 expr。
整数运算(expr)
(1)数字运算
expr 3 + 2
expr 3 - 2
expr 3 \* 2 # 注意*出现应该转义,否则认为是通配符
expr 3 / 2 # 没有小数,只有整数
expr 3 % 3
(2)let支持变量运算,只能做整数运算,且运算元素必须是变量,无法直接对整数做运算
let a=2
let a++
let b=a*3
let c=b%2
echo "a=$a b=$b"
(3)$(( ))同时支持数字运算与变量间运算,双小圆括号运算,在shell中(( ))也可以用来做数学运算
echo $(( a=a+1 ))
浮点运算(bc)
浮点运算是采用的命令组合的方式来实现的 echo “scale=N;表达式”|bc
先bc进入计算器然后进行运算即可,默认只有整数
echo "22 * 33"|bc #通用,quit退出
echo "print 22 * 22"| python3 #可以小数运算,vscode和Ubuntu都报错
举例:
echo "scale=2;3/2"|bc
echo "print(3/2)"| python3
# 获取随机整数
echo "import random;print(random.randint(1,100))"| python3
# 获取随机小数
echo "import random;print(random.random())"| python3
或者echo "import random;print(random.uniform(1,100))"| python3
# 获取内存总量与使用量,求内存占用量
total=`free|sed -n "2p"|awk '{print $2}'`
used=`free|sed -n "2p"|awk '{print $3}'`
echo "print(f'{$used/$total*100:.2f}%')"|python3
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | expr $a + $b 结果为 30。 |
| - | 减法 | expr $a - $b 结果为 -10。 |
| * | 乘法 | expr $a * $b 结果为 200。 |
| / | 除法 | expr $b / $a 结果为 2。 |
| % | 取余 | expr $b % $a 结果为 0。 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
| == | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
Shell 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 英文 | 举例 |
|---|---|---|---|
| -eq | 检测两个数是否相等,相等返回 true。 | equal | [ $a -eq $b ] 返回 false。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 | not equal | [ $a -ne $b ] 返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | greater than | [ $a -gt $b ] 返回 false。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | less than | [ $a -lt $b ] 返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | Greater than or equal to | [ $a -ge $b ] 返回 false。 |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | Less than or equal to | [ $a -le $b ] 返回 true。 |
可以通过test命令比较两个整数的关系,但不会返回结果,需要通过$?才能看到结果:
[root@zuolaoshi ~]# test 100 -gt 300;echo $?
1 #100大于300吗?假的
[root@zuolaoshi ~]# test 100 -le 300;echo $?
0 #100小于或等于300吗?真的
Shell布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| ! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
| -o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
Shell 逻辑运算符
完成一个任务中需要多个条件都满足或者多个条件中只要满足一个即可,那么这就是我们的逻辑运算,以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
| ! | 非运算 | [ ! false ] 返回 true。 |
Shell 字符串比较运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
| 运算符 | 说明 | 举例 |
|---|---|---|
| = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
| str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
Test文件判断命令
在 Linux 中,test 命令是条件测试工具,用于判断文件属性、字符串关系、数值大小等,返回值为 0(表示测试结果为 “真”)或非 0(表示 “假”),常与 if、while 等流程控制语句配合使用。
命令功能:检测文件类型和比较运算
命令用法:test [命令选项] 表达式
test 命令有两种等价语法形式,需注意括号前后必须有空格:
-
标准形式:
test 条件 -
简化形式:
[ 条件 ](更常用,本质是test命令的别名)
一、文件测试参数(最常用)
用于检测文件 / 目录的存在性、类型、权限、大小、修改时间等,是脚本中判断文件状态的核心参数。
| 参数 | 测试类型 | 描述(当满足以下条件时返回 “真”) | 示例(返回真则输出 “OK”) |
|---|---|---|---|
-e | 文件存在性 | 指定路径的文件 / 目录存在 | test -e /etc/passwd && echo "OK" |
-f | 文件类型 | 指定路径是普通文件(非目录、设备文件等) | [ -f ~/test.txt ] && echo "OK" |
-d | 文件类型 | 指定路径是目录 | test -d /home && echo "OK" |
-b | 文件类型 | 指定路径是块设备文件(如硬盘、U 盘) | [ -b /dev/sda1 ] && echo "OK" |
-c | 文件类型 | 指定路径是字符设备文件(如键盘、终端) | test -c /dev/tty1 && echo "OK" |
-s | 文件大小 | 文件非空(大小 > 0 字节) | [ -s ~/log.txt ] && echo "日志非空" |
-r | 文件权限 | 当前用户对文件有读权限 | test -r /etc/shadow && echo "有读权限" |
-w | 文件权限 | 当前用户对文件有写权限 | [ -w ~/test.txt ] && echo "有写权限" |
-x | 文件权限 | 当前用户对文件有执行权限(脚本 / 可执行程序) | test -x /bin/ls && echo "ls可执行" |
-g | 文件权限 | 文件设置了SGID(组权限继承) | [ -g /usr/bin/passwd ] && echo "有SGID" |
-u | 文件权限 | 文件设置了SUID(用户权限继承,如 passwd) | test -u /usr/bin/passwd && echo "有SUID" |
-k | 文件权限 | 文件设置了Sticky Bit(仅所有者删自己文件) | [ -k /tmp ] && echo "tmp有Sticky Bit" |
-nt | 修改时间 | 文件 A 的修改时间晚于文件 B(Newer Than) | test ~/a.txt -nt ~/b.txt && echo "a更新" |
-ot | 修改时间 | 文件 A 的修改时间早于文件 B(Older Than) | [ ~/a.txt -ot ~/b.txt ] && echo "a较旧" |
二、字符串测试参数
用于比较字符串的相等性、空值、长度等,需注意字符串建议用双引号包裹,避免空格或特殊字符导致解析错误。
| 参数 | 测试类型 | 描述(返回 “真” 的条件) | 示例 |
|---|---|---|---|
str1 = str2 | 字符串相等 | 字符串 str1 与 str2 完全相同 | [ "abc" = "abc" ] && echo "相等" |
str1 != str2 | 字符串不等 | 字符串 str1 与 str2 不相同 | test "abc" != "def" && echo "不等" |
-z str | 空字符串 | 字符串 str 的长度为 0(空字符串) | [ -z "$empty_var" ] && echo "变量为空" |
-n str | 非空字符串 | 字符串 str 的长度 > 0(非空) | test -n "$name" && echo "变量非空" |
注意:字符串比较的常见误区
-
若变量未定义,
[ $var = "test" ]会解析为[ = "test" ],导致语法错误;用双引号包裹变量可避免:[ "$var" = "test" ]。 -
=和!=是字符串比较专用,不能用于数值比较(数值需用-eq、-gt等)。
三、数值测试参数
用于比较两个整数的大小关系,仅支持整数,不支持浮点数。
| 参数 | 测试类型 | 描述(返回 “真” 的条件) | 示例 |
|---|---|---|---|
num1 -eq num2 | 数值相等 | 整数 num1 = num2(Equal) | [ 10 -eq 10 ] && echo "相等" |
num1 -ne num2 | 数值不等 | 整数 num1 != num2(Not Equal) | test 10 -ne 5 && echo "不等" |
num1 -gt num2 | 数值大于 | 整数 num1 > num2(Greater Than) | [ 20 -gt 15 ] && echo "20大" |
num1 -lt num2 | 数值小于 | 整数 num1 < num2(Less Than) | test 5 -lt 8 && echo "5小" |
num1 -ge num2 | 大于等于 | 整数 num1 > 或 = num2(Greater or Equal) | [ 10 -ge 10 ] && echo ">=成立" |
num1 -le num2 | 小于等于 | 整数 num1 < 或 = num2 (Less or Equal) | test 7 -le 9 && echo "<=成立" |
四、逻辑运算参数
用于组合多个测试条件(与、或、非),实现更复杂的判断逻辑。
| 参数 | 逻辑关系 | 描述(结合多个条件) | 示例(返回真则输出 “OK”) |
|---|---|---|---|
! 条件 | 逻辑非(NOT) | 对单个条件取反(真变假,假变真) | [ ! -f ~/test.txt ] && echo "不是普通文件" |
条件1 -a 条件2 | 逻辑与(AND) | 条件 1 且 条件 2 均为真时,结果为真 | test -f ~/a.txt -a -r ~/a.txt && echo "OK" |
条件1 -o 条件2 | 逻辑或(OR) | 条件 1 或 条件 2 有一个为真时,结果为真 | [ -d ~/dir -o -f ~/file ] && echo "OK" |
扩展:更直观的逻辑运算符([[ ]] 与 (( )))
test 命令的简化形式 [ ] 功能有限,实际脚本中更常用 [[ ]](字符串 / 文件测试) 和 (( ))(数值测试),支持更直观的逻辑运算符(&&、||),无需用 -a、-o:
-
逻辑与:
[[ 条件1 && 条件2 ]]或(( 条件1 && 条件2 )) -
逻辑或:
[[ 条件1 || 条件2 ]]或(( 条件1 || 条件2 ))
示例:
# 判断“是普通文件且有读权限”
[[ -f ~/a.txt && -r ~/a.txt ]] && echo "OK"
# 判断“数值a大于10或小于5”
a=12
(( a > 10 || a < 5 )) && echo "满足条件"
五、核心注意事项
1、空格不可省略:[ 是 test 的别名,必须与后续条件之间加空格,否则会被解析为普通命令(如 [-f file.txt] 会报错)。
2、字符串需加引号:变量或字符串含空格时,必须用双引号包裹(如 [ "$name" = "Zhang San" ]),否则会被拆分为多个参数。
3、数值与字符串比较区分:
-
数值比较用
-eq、-gt等(如[ 5 -gt 3 ]); -
字符串比较用
=、!=等(如[ "5" = "3" ]),若用[ 5 = 3 ]虽不报错,但本质是字符串比较,不推荐。
4、返回值的特殊性:test 命令的返回值与 “真 / 假” 相反 —— 返回 0 表示 “真”,返回非 0 表示 “假”(符合 Linux 命令 “无错为 0” 的约定)。
六、实际脚本示例
结合 if 语句使用 test 命令,判断文件是否存在并创建:
#!/bin/bash
file_path="~/test.txt"
# 用 [ ] 判断文件是否不存在
if [ ! -f "$file_path" ];
then
echo "文件 $file_path 不存在,正在创建..."
touch "$file_path" # 创建文件
else
echo "文件 $file_path 已存在"
fi
if [ -f /etc/rediss/redis.conf ]
then
cat /etc/redis/redis.conf
else
echo "文件不存在"
fi
运行脚本后,若 test.txt 不存在则创建,存在则提示已存在,体现了 test 命令在条件判断中的核心作用。
shell条件——循环和条件语句
流程控制——多分支写法
1)if else语句
# If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
# 单分支语句 ---比较大小
if (条件表达式);then
语句1
fi
# 双分支if 语句
if (表达式)
语句1
else
语句2
fi
# 多支条件语句 ---判断成绩
if (表达式)
语句1
elif
语句2
elif
语句2
fi
2) for 循环
格式
# 格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
语句 1
done
3) while 语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition; do
command
done
4) 无限循环
无限循环语法格式:
while true; do
command
done
# 需求: 每隔1秒 打印一次当前时间
#!/bin/bash
while true; do
date
sleep 1
done
5) case(Java里的switch,用来做选项)
Shell case 语句为多选择语句。可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case 语句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case 工作方式如上所示。取值后面必须为单词 in,
每一模式必须以右括号结束。取值可以为变量或常数。
匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。
一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。
如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
退出循环的命令的区别
exit 结束或退出当前的Shell
break 退出当前循环,继续执行下一个代码(终止后面的所有循环)
continue 退出本次循环,继续进行下一次循环
# 循环0~9
n=0
while [ $n -lt 10 ]
do
echo $n
n=$(($n+1))
done
函数
概念:一个代码段,起个函数名,通过函数名可以重复调用该代码;
函数的优点:模块化
-
代码模块化,调用方便,节省内存
-
代码模块化,代码量少,排错简单
-
代码模块化,可以改变代码的执行顺序
可以使用$1~$9作为位置参数;
return 0;表示成功,1~127表示失败;
函数定义:
## 语法一:
函数名() {
代码块
return N
}
## 语法二:
function 函数名() {
代码块
return N
}
函数中return说明:
1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
2.return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间。
3.如果没有return命令,函数将返回最后一个Shell的退出值。
课堂案例:
## 用函数输出0~9,function可以省略
function print_num(){
n=0
while [ $n -lt 10 ]
do
echo $n
n=$(( $n + 1 ))
done
return 0;
}
print_num $1
## 测试命令是否成功
ch_ok() {
if [ $? -eq 0 ]
then
echo -e "$1 \033[32m【成功】 \033[0m"
else
echo -e "$1 \033[31m【失败】 \033[0m"
exit
fi
}
yum install vim
ch_ok "yum"
# 或者后两行改成
apt install vim &> /dev/null # 不显示执行的过程和结果
ch_ok "apt"
第一个显示:![]()
第二个显示:![]()
## 一个循环输入1234查看信息的例子
while true
do
cat << EOF
1.执行查看内存
2.查看磁盘空间
3.查看IP地址
4.退出
EOF
read -p "请选择" chang
case $chang in
1)
free -h
;;
2)
df -h
;;
3)
ip a
;;
4)
exit
;;
*)
echo "你的输入有误!"
esac
done
253



被折叠的 条评论
为什么被折叠?



