
08_Linux_脚本编程
本文最后更新于 2025-03-11,学习久了要注意休息哟
第一章 shell
1.1 什么是shell
是用户和Linux系统交互的一个中间件,是shell命令的集合,shell是解释性语言,C语言是编译性语言。
(1)sh
(2)csh
(3)ksh
(4)bash 当前Ubuntu中默认的命令行解析器
1.2 shell 脚本的本质
shell 命令的集合
shell 脚本是以 .sh结尾的文件
shell 使用命令功能的集合,以及控制语句、变量、函数
1.3 shell脚本编写及执行过程
1. 创建文件 -->> 文件名.sh
文件第一行 写上 #!/bin/bash 告诉 shell 脚本用那个解释器
2. 改权限 --->> 给.sh 文件添加上 可执行权限
chmod 777 文件名.sh
chmod u+x 文件名.sh
3. 执行
(1) ./文件名.sh ----> 新终端中运行 & 需要执行权限
(2) bash 文件名.sh ----> 新终端中运行
(3) source 文件名.sh ----> 在当前终端中运行
第二章 shell 的输入输出
2.1 echo 输出 ---> 终端
echo "hello" 将字符直接输出到终端
echo "hello1" "hello2" 输出两个
echo -n "hello" 取消回车
echo $变量名 输出变量
2.2 read 输入 ---> 键盘
read 变量 从键盘中读取内容 赋值给变量
read X1 X2 X3 读取多个值 并用空格隔开
$ echo "hello"
$ read num
123
$ echo $num
123
第三章 shell 变量
在shell 中有四种变量
用户自定义变量
环境变量
预定义变量 ->位置变量
3.1 用户自定义变量
3.1.1 如何声明
shell 是运行用户去建立变量的,不支持数据类型 , 需要注意的是 中间加空格 会被认为是三个命令
变量名=20
变量名=nihao
X=20
S=nihao
3.1.2 如何使用
$
----> echo $s$n
echo $s
${}
----> echo ${s}nihao
${Cpr} ${Mnt}${G_x} ${pro}
3.1.3 赋值方向
在程序中 都是将 将右值 赋值给 左值
A=1
B=ABC
A=$B // 重新赋值
echo $A
3.1.4 清除变量unset
unset 不是让变量变成 0
而是直接释放 --> NULL
A=1
B=ABC
A=$B // 重新赋值
echo $A
unset A
echo $A
3.1.5 赋值区别问题
不带引号 带双引号 带单引号 带反引号
不带引号 : 也可以调变量
带双引号"" :也可以调变量
带单单引号' ' :可以有空格,不能调用变量 , 但是可以用于打印 ""
带反引号 :
#!/bin/bash
echo '请输入你的英雄'
read YX
# 单引号 和 双引号
# 单引号 不能使用 变量
# 双引号 也可以调变量
echo '单引号输出 你的英雄为 "$YX"'
echo "双引号输出 你的英雄为 '$YX'"
P=`pwd`
echo "你当前所在的位置为:$P"
L=`ls` # 行缓冲 不会存在 回车
echo "当前目录下面有:"
echo $L
3.1.6 标识符命名规则
标识符: 变量名 函数名 常量名
系统用于区分变量的符号
标识符的组成 和c语言一样
1、由字母、下划线、数字组成
2、不可以用数字开头
3、只能上述三种,不可以有其他的符号
4、不能关键字
5、不能和同环境下其他标识符撞名
关键字
系统保留字 if
标识符
变量名 函数名
1、由字母、下划线、数字组成
2、不可以用数字开头
3、只能上述三种,不可以有其他的符号
4、不能关键字
5、不能和同环境下其他标识符撞名
不可以和保留字冲突 这里和c语言有区别
c语言 : 关键字
shell : 命令 环境变量 关键字
3.2 系统环境变量
env 去查看系统中的所有变量
PATH
USER: 系统当前登陆用户
UID: 系统当前登陆用户的用户编号
HOME: 当前登陆用户的用户主目录
PWD: 当前路径的绝对路径
TERM: 终端的类型,常用的有vt100,ansi,vt200,xterm等
vim ~/.bashrc
export 暂时修改环境变量
alias 暂时修改环境变量 区别是 不用加 $ 美元符
export L="ls -la"
$L
alias HQJY="echo “hello”" 在命令行 直接输入 HQYJ 则可以打印hello
source ~/.bashrc 使文件配置立即生效 对当前用户生议
3.3 预定义变量
3.3.1 位置变量
$0: 当前文件名,即命令名。
$1: 执行脚本时,带的命令行参数,$1表示第一个参数$2:第二个位置参数
$@: 表示所有命令行参数,是$1....$9的汇总
3.3.2 预定义变量
$$:当前进程进程号
$#:位置参数的个数(不包括命令)
$*:位置参数的内容
$?:上一个命令执行成功与否:
如果成功执行则$?的值为0
执行失败则$?的值为非0
三目运算符
#!/bin/bash
# 读取用户输入的两个数字
echo "请输入第一个数字:"
read num1
echo "请输入第二个数字:"
read num2
# 使用三目运算符比较数字大小 ? : 如果 ? 前面为真 则返回 : 左边的值 如果为假 则返回 : 右边的值
result=$((num1 > num2 ? num1 : num2))
# 输出结果
echo "较大的数字是: $result"
第四章 数组
在空间中连续存储的同类型数据集合
4.1 数组的定义
arr=(成员1 成员2 成员3)
arr=([0]=成员1 [3]=成员2 [2]=成员3)
4.2 数组的赋值
arr[3]=20
4.3 数组的访问
echo ${arr_1[*]} # 遍历数组
echo ${arr_2[@]} # 遍历数组
echo ${arr_2[5]} # 数组访问
.
4.4 数组的长度
成员个数
echo ${#arr_1[*]} # 遍历数组查看长度
echo ${#arr_2[@]} # 遍历数组查看长度
4.5 数组的成员长度
echo ${#arr_2[5]} # 查看长度
第五章 功能性语句
5.1 测试性语句
test: test 语句可以测试三种对象, 字符串 、 数字 、 文件类型
5.1.1格式
格式1:test 测试条件
格式2:[ 测试条件 ]
如下,判断两个字符串是否相等
if test "string1" = "string2"; then
echo "字符相等"
fi
str_1="张三"
str_2="张三"
if test $str_1 = $str_2; then
echo "字符相等"
fi
if [ "string1" = "string2" ]; then
echo "字符相等"
fi
5.1.2 测试条件
(1)字符串对象(一定要注意在进行字符串的判断的时候都需要加上"", "$a" "hello"
-z 判断字符串是否为空
-n 判断字符串是否为非空
=或-- 都是用来判读字符串是否相等!=不等于
\> 大于(防止误认为重定向)
\< 小于
(2)数字对象
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
(3)文件属性
-b filename 检测文件是否为块设备,如果是则返回真
-c filename 检测是否是字符设备文件,如果是则返回真
-d filename 判断文件是否是目录,如果是则返回真
-p filename 检测文件是否是管道文件,如果是则返回真
-f filename 检测文件是否是普通文件,如果是则返回真
-x filename 检测文件是否是可执行文件,如果是则返回真
-L filename 判断文件是否存在,是否是链接文件(经测试链接文件也是
-S filename 判断文件是否存在,是否是套接字文件
-s filename 判断文件是否存在,判断文件是否为空
-e filename 判断文件是否存在
(4)文件权限
-r filename 判断文件是否存在,是否有可读权限
-w filename 判断文件是否存在,是否有可写权限
-x filename 判断文件是否存在,是否有可执行权限
(5)文件比较
-nt 文件是否更新
-ot 文件是否更旧
-ef 文件的inode是否一致
(6)逻辑运算
-a 与 &&
-o 或 ||
! 非
第六章 结构型语句
6.1 if判断语句
在Shell中,if
语句用于根据条件执行不同的代码块。它的基本语法结构如下:
if [ condition ]; then
# 如果条件为真,则执行这里的代码块
commands
elif [ another_condition ]; then
# 如果前一个条件为假且此条件为真,则执行这里的代码块
commands
else
# 如果以上所有条件都为假,则执行这里的代码块
commands
fi
我的需求
1 灯亮
0 灯灭
实际情况
低电平 灯亮
高电平 灯灭
read led_std
led_std = 1 灯亮
led_std = 0 灯灭
read led_std
if [ led_std -ne 0 ] then;
echo "低电平"
elif [ led_std -eq 0 ] then;
echo "高电平"
fi
int opne_led; // 用于控制灯亮和灯灭
int LED_x;
选灯
输入1 的时候灯亮
输入0 的时候灯灭
实际1 灭
实际0 亮
if(opne_led == 1) opne_led = 0;
else if(opne_led == 0 && LED_x == 1) opne_led = 1;
其中:
if
后面是条件,可以是命令的返回状态码(0为真,非0为假)、字符串比较、数字比较等。then
表示条件为真时执行的代码块的开始。elif
表示额外的条件,可选,用于检查其他条件。else
用于指定条件都不满足时执行的代码块,也是可选的。fi
表示结束if
语句块。
下面是一个简单的示例,演示了如何在Shell脚本中使用if
语句:
#!/bin/bash
# 定义一个变量
score=85
# 使用if语句检查变量的值
if [ $score -ge 60 ]; then
echo "Pass"
else
echo "Fail"
fi
在这个例子中,如果变量score
的值大于或等于60,则输出"Pass",否则输出"Fail"。
6.2 case 分支语句
在Shell脚本中,case
语句用于根据某个变量的不同取值执行不同的操作。case
语句通常与esac
配对使用,用于结束case
块。基本的语法结构如下:
case 表达式 in
条件)
# 如果expression匹配pattern1,则执行这里的命令
执行语句
;;
条件)
# 如果expression匹配pattern2,则执行这里的命令
执行语句
;;
...
*)
# 如果expression与所有pattern都不匹配,则执行这里的命令(可选)
执行语句
;;
esac
其中:
case
后面是一个表达式,通常是要匹配的变量。in
标识case
语句的开始。pattern
是用于匹配的模式,可以是通配符或正则表达式。)
表示模式的结束。commands
是与匹配的模式相关联的命令序列。;;
用于标记每个模式的结束。*)
是一个可选项,用于指定没有匹配到任何模式时执行的命令。
下面是一个示例,演示了如何在Shell脚本中使用case
语句:
#!/bin/bash
# 定义一个变量
day="Monday"
# 使用case语句根据不同的值执行不同的命令
case $day in
Monday)
echo "Today is Monday"
;;
Tuesday)
echo "Today is Tuesday"
;;
Wednesday|Thursday|Friday)
echo "Today is a weekday"
;;
Saturday|Sunday)
echo "Today is a weekend"
;;
*)
echo "Invalid day"
;;
esac
在这个例子中,根据变量day
的值不同,case
语句会执行相应的命令块。
6.3 for 循环语句
在Shell脚本中,for
循环语句用于迭代一个列表中的元素,对每个元素执行相同的操作。基本的for
循环语法如下:
for variable in list
do
# 在这里执行针对每个元素的操作
commands
done
其中:
variable
是循环中用来存储当前迭代元素的变量名。list
是要迭代的元素列表,可以是一组单词、文件列表、数字范围等。
下面是几个示例来演示不同类型的for
循环:
- 遍历数组中的元素:
#!/bin/bash
# 定义一个数组
fruits=("apple" "banana" "orange")
# 使用for循环遍历数组中的元素
for fruit in "${fruits[@]}"
do
echo "I like $fruit"
done
- 遍历目录中的文件:
#!/bin/bash
# 使用for循环遍历目录中的文件
for file in /path/to/directory/*
do
echo "Processing file: $file"
# 这里可以对文件执行相应的操作
done
- 使用数字范围进行迭代:
#!/bin/bash
# 使用for循环遍历数字范围
for i in {1..5}
do
echo "Number: $i"
done
- 使用命令输出作为循环列表:
#!/bin/bash
# 使用for循环遍历命令输出的结果
for user in $(cat /etc/passwd | cut -d ":" -f 1)
do
echo "User: $user"
done
以上是几个常见的for
循环示例,你可以根据具体需求选择合适的方式来使用for
循环。
打印金字塔
#!/bin/bash
# 定义三角形的高度
height=5
# 外层循环控制行数
for ((i = 1; i <= height; i++))
do
# 内层循环控制每行中的空格
for ((j = 1; j <= height - i; j++))
do
echo -n " "
done
# 内层循环控制每行中的星号
for ((k = 1; k <= 2 * i - 1; k++))
do
echo -n "*"
done
打印完星号后换行
echo ""
done
6.4 while 语句
和C语言 基本一样
在Shell脚本中,while
语句用于创建一个循环,只要给定的条件为真,就会执行一系列命令。while
语句的基本语法如下:
while 条件语句
do
# 在这里执行循环体中的命令
执行语句
done
其中:
condition
是一个用于判断循环是否继续的条件。commands
是在循环每次迭代时执行的命令。
示例:
#!/bin/bash
# 初始化计数器
counter=1
# 使用while循环打印计数器的值,直到计数器值为5为止
while [ $counter -le 5 ]
do
echo "Counter: $counter"
# 增加计数器值
((counter++))
done
在这个示例中,while
循环将打印计数器的值,并在每次迭代时递增计数器的值。当计数器的值达到5时,循环终止。
while
循环可以处理任何条件,条件可以是测试命令、数值比较、字符串比较等等。只要条件为真,循环就会继续执行。
第七章 shell的函数
7.1 shell函数的定义
在Shell脚本中,函数用于封装一段可重复使用的代码,并通过名称来调用它。定义和使用函数的基本语法如下:
function_name() {
# 函数体,包含要执行的代码
函数体
}
# 调用函数
function_name
或者也可以这样定义函数:
function function_name {
# 函数体,包含要执行的代码
commands
}
# 调用函数
function_name
其中:
function_name
是函数的名称,可以根据需要自定义。commands
是函数体,包含要执行的代码块。
7.2 shell 函数的调用
下面是一个示例,演示了如何在Shell脚本中定义和调用函数:
#!/bin/bash
# 定义一个函数 192.168.110.130
greet() {
echo "Hello, $1!"
}
# 调用函数
greet "Alice"
greet "Bob"
返回值 函数名 参数列表
这个例子定义了一个名为greet
的函数,它接受一个参数并向该参数打印问候语。然后使用greet
函数两次,分别传入不同的参数调用它。
在Shell脚本中,函数可以接受参数,就像普通的命令行参数一样。在函数内部,可以使用$1
、$2
等来引用传递给函数的参数。
除了简单的函数调用外,你还可以在函数中使用流程控制语句、循环、条件语句等。函数使得代码结构更加清晰,并且能够重复使用特定功能的代码块。
第八章 shell脚本的算数运算
在Shell脚本中,有几种进行算术运算的方式,其中包括使用内置的算术运算符和命令,以及使用expr
命令和let
命令。
8.1 内置算术运算符
在Shell脚本中,可以使用$((...))
语法执行基本的算术运算,例如:
#!/bin/bash
# 加法
result=$((5 + 3))
echo "5 + 3 = $result"
# 减法
result=$((10 - 4))
echo "10 - 4 = $result"
# 乘法
result=$((6 * 2))
echo "6 * 2 = $result"
# 除法
result=$((20 / 4))
echo "20 / 4 = $result"
# 求余
result=$((13 % 5))
echo "13 % 5 = $result"
8.2 使用expr
命令
expr
命令用于在Shell脚本中执行基本的算术运算,例如:
#!/bin/bash
#
num_1=$(expr 5 + 3)
注意,在使用*
进行乘法时,需要对其进行转义,因为*
在Shell中通常用于文件名扩展。
8.3 使用let
命令
let
命令用于在Shell脚本中执行算术运算,并且可以直接将结果赋值给变量,例如:
#!/bin/bash
let result=5+3
echo "5 + 3 = $result"
let result=10-4
echo "10 - 4 = $result"
let result=6*2
echo "6 * 2 = $result"
let result=20/4
echo "20 / 4 = $result"
let result=13%5
echo "13 % 5 = $result"
这些方法都可以用于在Shell脚本中执行基本的算术运算。
- 感谢你赐予我前进的力量