第十章:sh编程介绍
第十章的主要内容是研究sh编程。对于sh编程的介绍分为以下几个方面:
1. sh脚本的编写
脚本格式以#!/bin/bash
开头(指向解释器)
2. sh控制语句
2.1 脚本格式
脚本格式以#!/bin/bash
开头(指向解释器)
2.2 第一个shell脚本,helloworld.sh,输出helloworld!
2.3 执行方式
方式一:sh
或 bash
+ 相对或绝对的文件路径(不需要 +x)
方式二:直接输入脚本的相对或绝对路径(需授可执行权限 +x)
方式三:在脚本的路径前面,使用一个.
或一个 source
(这种方式不同于以上2种,以上两种运行时会嵌套子shell,这个不会嵌套,就在本环境运行,开子shell与不开子shell的区别在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell中是不可见的)
2.4 变量
2.4.1 系统预定义变量
a. 常用的系统变量(这里大多数都是写全局的环境变量): $HOME
, $PATH
, $SHELL
等, $PWD
2.4.2 自定义变量
a. 基本语法:
- 定义变量:变量名=变量值,注意:=前后不能有空格
- 撤销变量:
unset 变量名
- 申明静态变量:
readonly 变量
,注意:不能unset
b. 变量定义的规则:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在bash中,默认变量都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或者单引号给括起来。
c. 案例实操:
(1)下图中设置的变量时局部变量(比如,在当前环境设置后,在子bash中就访问不到)
(2)设置为全局变量
步骤1:先设置局部变量
步骤2:export 变量
注:意思就是把父shell中的变量导出变成一个全局变量
注意:子bash中更改的的全局变量,只在子bash中有效,退出子bash后无效
2.4.3 特殊变量
a. 位置参数:$n
:
(1)基本语法:
$n
(功能描述:n为数字,$0
代表脚本名称,$1-$9
代表一到九个参数,十以上的要用大括号包含${10}
)
b. 参数个数:$#
(1)基本语法:
$#
(获取所有输入参数的个数,常用于循环,判断参数个数是否正确以及加强脚本的健壮性)
c. 获取参数:$*
和 $@
(1)基本语法
$*
:这个变量代表命令行中所有的参数, $*
把所有的看成一个整体
$@
:这个变量代表命令行中所有的参数,不过$@
把每个参数区分对待
d. 返回状态:$?
(1)基本语法
$?
:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
3. 运算符
(1)基本语法
$((运算式))
或 $[运算式]
4. 条件判断
(1)基本语法
a. test condition
b. [ condition ]
注意:condition前后要有空格
注意:1.条件非空返回true,否则返回false;2.记得加空格,不然程序会认为是一个值
c. 常用判断条件
(1)两个整数之间比较
-eq
:等于(equal)-ne
:不等于(not equal)-lt
:小于(less than)-le
:小于等于(less equal)-gt
:大于(greater than)-ge
:大于等于(greater equal)
注:如果四字符串之间的比较,用"="判断相等,用"!="判断不等
(2)按照文件权限进行判断-r
:有可读权限(read)-w
:有可写权限(write)-x
:有可执行权限(execute)
(3)按照文件的类型进行判断-e
:文件存在(existence)-f
:文件存在且是一个常规的文件(file)-d
:文件存在且是一个目录(directory)
(4)多条件判断&&
:表示前一个命
令执行成功时,才执行后一条命令
||
:表示上一条命令失败后,才执行下一条命令-a
:即all同&&,但是&&不能在 [] 中使用,示例:[ $age -gt 18 -a $age -lt 35 ]
-o
:即or同||,但是||不能在 [] 中使用,示例:[ $age -gt 18 -o $age -lt 35 ]
[ … ] && … || …
其实就是if…else…语句了
d. 案例实操
5. 流程控制(重点)
- 5.1、if判断(双分支的逻辑结构,二叉树)
a. 基本语法
(1)单分支
if [ 条件判断式 ]; then #分号表示一行出现2步命令的实现
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
b. 案例实操
- 5.2、case语句(多分支的逻辑结构,多叉树)
a. 基本语法
case $变量名 in
“值1”)
如果这个值等于值1,则执行程序1
;;
“值2”)
如果这个值等于值2,则执行程序2
;;
…省略其它分支…
)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case行尾必须为单词"in",每个模式必须以右括号")“结束。
(2)双分号”;;“表示命令序列结束,相当于java中的break
(3)最后的”"表示默认模式,相当于java中的default
b. 案例实操
- 5.3、for循环
a. 基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
大家会发现他报错了,我仔细检查并更改了很多次之后还是报错,于是在菜鸟教程里找到了解决方案,即用bash命令而不是sh命令运行脚本。
b. 基本语法2
for 变量 in 值1 值2 值3
do
程序
done
c. 操作实例2
增强for循环
- 5.4、while循环(条件判断循环)
a. 基本语法
while [ 条件判断式 ]
do
程序
done.
b. 案例实操
6. read读取控制台输入
a. 基本语法
read (选项) (参数)
选项:
-p
:指定读取值时的提示符-t
:读取超时时间(超时退出)
参数:
- 变量:指定读取值的变量名
b. 案例实操
7. 函数
7.1 系统函数
玩一个比较典型的函数basename
basename [string/pathname] [suffix]
功能描述:basename命令会删掉所有前缀,包括最后一个('/'字符),然后将字符显示出来。basename可以理解为获取路径里的文件名称。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
7.2 自定义函数
a. 基本语法
[function] funname[()]
{
Actiion;
[return int;]
}
b. 经验技巧
- 必须在调用之前先申明函数,先申明函数,shell脚本是逐行运行(解释性语言)。不会像其它语言一样先去编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值0-255
c. 案例实操
Chatgpt苏格拉底提问
遇到的问题:
在shell语法使用部分,书上的内容讲解较为模糊,很多地方我并不能听懂,实践起来亦有困难。
解决方案:
通过菜鸟教程、博客园、csdn等平台搜索有关知识点最终掌握了基本的语法
标签:语法,shell,变量,判断,笔记,学习,sh,bash From: https://www.cnblogs.com/lududuze/p/17726012.html