本文最后更新于 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 使用命令功能的集合,以及控制语句、变量、函数
Undefined

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	 ---->		在当前终端中运行

Lua

第二章 shell 的输入输出

2.1 echo 输出 ---> 终端

echo "hello" 			将字符直接输出到终端
echo "hello1" "hello2"	输出两个
echo -n "hello"			取消回车
echo $变量名			  输出变量

Bash

2.2 read 输入 ---> 键盘

read 变量			从键盘中读取内容 赋值给变量
read X1 X2 X3 	 读取多个值 并用空格隔开
Bash
$ echo "hello"
$ read num
123
$ echo $num
123
Shell

第三章 shell 变量

在shell 中有四种变量

用户自定义变量
环境变量
预定义变量  ->位置变量
Rust

3.1 用户自定义变量

3.1.1 如何声明

shell 是运行用户去建立变量的,不支持数据类型 , 需要注意的是 中间加空格 会被认为是三个命令

变量名=20
变量名=nihao

X=20
S=nihao
Makefile

3.1.2 如何使用

$ ----> echo $s$n echo $s

${} ----> echo ${s}nihao

${Cpr} ${Mnt}${G_x} ${pro}
Shell

3.1.3 赋值方向

在程序中 都是将 将右值 赋值给 左值

A=1
B=ABC
A=$B    // 重新赋值
echo $A
Shell

3.1.4 清除变量unset

unset 不是让变量变成 0

而是直接释放 --> NULL

A=1
B=ABC
A=$B    // 重新赋值
echo $A
unset A
echo $A
Shell

3.1.5 赋值区别问题

不带引号 带双引号 带单引号 带反引号

不带引号 : 也可以调变量

带双引号"" :也可以调变量

带单单引号' ' :可以有空格,不能调用变量 , 但是可以用于打印 ""

带反引号 :

#!/bin/bash

echo '请输入你的英雄'

read YX

# 单引号 和 双引号
# 单引号  不能使用 变量
# 双引号  也可以调变量
echo '单引号输出 你的英雄为 "$YX"'
echo "双引号输出 你的英雄为 '$YX'"

P=`pwd`

echo  "你当前所在的位置为:$P"

L=`ls`   # 行缓冲  不会存在 回车
echo "当前目录下面有:"
echo $L

Shell

3.1.6 标识符命名规则

标识符: 变量名 函数名 常量名

系统用于区分变量的符号

标识符的组成 和c语言一样

1、由字母、下划线、数字组成
2、不可以用数字开头
3、只能上述三种,不可以有其他的符号
4、不能关键字
5、不能和同环境下其他标识符撞名

关键字
	系统保留字   if 
		
标识符
	变量名 函数名
        1、由字母、下划线、数字组成
        2、不可以用数字开头
        3、只能上述三种,不可以有其他的符号
        4、不能关键字
        5、不能和同环境下其他标识符撞名
Markdown

不可以和保留字冲突 这里和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	使文件配置立即生效  对当前用户生议

Shell

3.3 预定义变量

3.3.1 位置变量

$0: 当前文件名,即命令名。
$1: 执行脚本时,带的命令行参数,$1表示第一个参数$2:第二个位置参数
$@: 表示所有命令行参数,是$1....$9的汇总

Bash

3.3.2 预定义变量

$$:当前进程进程号 
$#:位置参数的个数(不包括命令)
$*:位置参数的内容
$?:上一个命令执行成功与否:
	如果成功执行则$?的值为0
	执行失败则$?的值为非0
Makefile

三目运算符

#!/bin/bash

# 读取用户输入的两个数字
echo "请输入第一个数字:"
read num1
echo "请输入第二个数字:"
read num2

# 使用三目运算符比较数字大小   ? :    如果 ? 前面为真 则返回 : 左边的值 如果为假 则返回 : 右边的值
result=$((num1 > num2 ? num1 : num2))

# 输出结果
echo "较大的数字是: $result"
Shell

第四章 数组

在空间中连续存储的同类型数据集合

4.1 数组的定义

arr=(成员1 成员2 成员3)
arr=([0]=成员1 [3]=成员2 [2]=成员3)

Shell

4.2 数组的赋值

arr[3]=20
Shell

4.3 数组的访问

echo ${arr_1[*]}   # 遍历数组
echo ${arr_2[@]}   # 遍历数组
echo ${arr_2[5]}    # 数组访问
.
Shell

4.4 数组的长度

成员个数

echo ${#arr_1[*]}   # 遍历数组查看长度
echo ${#arr_2[@]}   # 遍历数组查看长度
Bash

4.5 数组的成员长度

echo ${#arr_2[5]}   # 查看长度
Bash

第五章 功能性语句

5.1 测试性语句

test: test 语句可以测试三种对象, 字符串 、 数字 、 文件类型

5.1.1格式

格式1:test 测试条件
格式2:[ 测试条件 ]
Shell

如下,判断两个字符串是否相等

if test "string1" = "string2"; then
    echo "字符相等"
fi


str_1="张三"
str_2="张三"
if test $str_1 = $str_2; then
    echo "字符相等"
fi
Shell
if [ "string1" = "string2" ]; then
    echo "字符相等"
fi
Shell

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||
	!
Perl

第六章 结构型语句

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;

Bash

其中:

  • 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
Bash

在这个例子中,如果变量score的值大于或等于60,则输出"Pass",否则输出"Fail"。

6.2 case 分支语句

在Shell脚本中,case语句用于根据某个变量的不同取值执行不同的操作。case语句通常与esac配对使用,用于结束case块。基本的语法结构如下:

case 表达式 in
    条件)
        # 如果expression匹配pattern1,则执行这里的命令
        执行语句
        ;;
    条件)
        #	 如果expression匹配pattern2,则执行这里的命令
        执行语句
        ;;
    ...
    *)
        # 如果expression与所有pattern都不匹配,则执行这里的命令(可选)
        执行语句
        ;;
esac
Bash

其中:

  • 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
Bash

在这个例子中,根据变量day的值不同,case语句会执行相应的命令块。

6.3 for 循环语句

在Shell脚本中,for循环语句用于迭代一个列表中的元素,对每个元素执行相同的操作。基本的for循环语法如下:

for variable in list
do
    # 在这里执行针对每个元素的操作
    commands
done 
Bash

其中:

  • variable是循环中用来存储当前迭代元素的变量名。
  • list是要迭代的元素列表,可以是一组单词、文件列表、数字范围等。

下面是几个示例来演示不同类型的for循环:

  1. 遍历数组中的元素:
#!/bin/bash

# 定义一个数组
fruits=("apple" "banana" "orange")

# 使用for循环遍历数组中的元素
for fruit in "${fruits[@]}"
do
    echo "I like $fruit"
done
Bash
  1. 遍历目录中的文件:
#!/bin/bash

# 使用for循环遍历目录中的文件
for file in /path/to/directory/*
do
    echo "Processing file: $file"
    # 这里可以对文件执行相应的操作
done
Bash
  1. 使用数字范围进行迭代:
#!/bin/bash

# 使用for循环遍历数字范围
for i in {1..5}
do
    echo "Number: $i"
done
Bash
  1. 使用命令输出作为循环列表:
#!/bin/bash

# 使用for循环遍历命令输出的结果
for user in $(cat /etc/passwd | cut -d ":" -f 1)
do
    echo "User: $user"
done
Bash

以上是几个常见的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
Shell

6.4 while 语句

和C语言 基本一样

在Shell脚本中,while语句用于创建一个循环,只要给定的条件为真,就会执行一系列命令。while语句的基本语法如下:

while 条件语句
do
    # 在这里执行循环体中的命令
    执行语句
done
Bash

其中:

  • condition是一个用于判断循环是否继续的条件。
  • commands是在循环每次迭代时执行的命令。

示例:

#!/bin/bash

# 初始化计数器
counter=1

# 使用while循环打印计数器的值,直到计数器值为5为止
while [ $counter -le 5 ]
do
    echo "Counter: $counter"
    # 增加计数器值
    ((counter++))
done
Bash

在这个示例中,while循环将打印计数器的值,并在每次迭代时递增计数器的值。当计数器的值达到5时,循环终止。

while循环可以处理任何条件,条件可以是测试命令、数值比较、字符串比较等等。只要条件为真,循环就会继续执行。

第七章 shell的函数

7.1 shell函数的定义

在Shell脚本中,函数用于封装一段可重复使用的代码,并通过名称来调用它。定义和使用函数的基本语法如下:

function_name() {
    # 函数体,包含要执行的代码
    函数体
}

# 调用函数
function_name
Bash

或者也可以这样定义函数:

function function_name {
    # 函数体,包含要执行的代码
    commands
}

# 调用函数
function_name
Bash

其中:

  • function_name是函数的名称,可以根据需要自定义。
  • commands是函数体,包含要执行的代码块。

7.2 shell 函数的调用

下面是一个示例,演示了如何在Shell脚本中定义和调用函数:

#!/bin/bash

# 定义一个函数 192.168.110.130
greet() {
    echo "Hello, $1!"
}

# 调用函数
greet "Alice"
greet "Bob"

返回值  函数名  参数列表


Bash

这个例子定义了一个名为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"

Bash

8.2 使用expr命令

expr命令用于在Shell脚本中执行基本的算术运算,例如:

#!/bin/bash

# 

num_1=$(expr 5 + 3)
Bash

注意,在使用*进行乘法时,需要对其进行转义,因为*在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"
Bash

这些方法都可以用于在Shell脚本中执行基本的算术运算。