shell脚本学习笔记
Shell脚本学习笔记
参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html
文章目录
- Shell脚本学习笔记
- 一、什么是Shell
- 1.1、定义
- 1.2、注释
- 二、Shell变量
- 2.1、规则
- 2.2、变量类型
- 2.2.1、字符串
- 2.2.2、整数
- 2.2.3、数组
- 2.2.4、环境变量
- 2.2.5、特殊变量
- 三、Shell传递参数
- 四、Shell运算符
- 4.1、算数运算符
- 4.2、关系运算符
- 4.3、布尔运算符
- 4.4、字符串运算符
- 4.5、文件测试运算符
- 4.6、逻辑运算符
- 4.7、自增和自减操作符
- 4.7.1、使用 let 命令
- 4.7.2、使用 $(( )) 进行算术运算
- 4.7.3、使用 expr 命令
- 4.7.4、使用 (( )) 进行算术运算
- 五、echo命令
- 5.1输出特殊字符
- 5.2输出内容到文件
- 5.3输出命令执行结果
- 六、printf命令
- 6.1、printf用法及规则
- 6.2、printf转义符
- 七、test命令
- 7.1数值测试
- 7.1、数值测试
- 7.2、字符串测试
- 7.3、文件测试
- 八、流程控制
- 8.1、if语句
- 8.2、for循环
- 8.3、while循环
- 8.4、until循环
- 8.5、case ... esac
- 8.6、跳出循环
- 8.6.1、break
- 8.6.2、continue
- 九、函数
- 9.1、函数格式
- 9.2、参数
- 9.3、返回值
- 十、输入、输出重定向
- 10.1、输出重定向
- 10.2、输入重定向
- 10.3、补充知识
- 十一、文件包含
一、什么是Shell
1.1、定义
通俗来讲,shell就是linux下的一种可执行程序,我们只需按照shell的规则进行编写,就能与linux操作系统交互。更简单点,shell就是将linux各种命令写到一个文件里。
第一个shell脚本:在linux下安装好VI/VIM编辑器,创建一个名为shelltest.sh的文件,在文件里写下两行代码并保存退出:
#!/bin/bash
echo "hello world!"
第一行:告诉系统这个脚本需要什么解释器来执行,可以暂时理解为固定格式,照着写就可以
第二行:echo用来向终端输出文本,类似于C语言的printf
运行结果:向终端输出“hello world!”字符串
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ vi shelltest.sh
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
hello world!
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
1.2、注释
1)shell中使用 #
号注释单行代码,例如:
#----------------------
#这是我的第一个shell脚本
#----------------------
#!/bin/bash
echo "hello world!"
2)使用 冒号 + 空格 + 单引号
注释多行代码,例如:
: '
这是我的第一个shell脚本
多行注释测试
'
#!/bin/bash
echo "hello world!"
二、Shell变量
2.1、规则
1)命名规则:
变量名与等号中间不能有空格,变量名尽量大写,只包含字母数字下划线且不能数字开头,不能使用特殊字符($、空格等)、不能使用shell关键字(if、then、else等),例如:
#!/bin/bash
VALUE=123
2)变量使用:将变量名放在${}
内,例如:
#!/bin/bash
VALUE=123
STRING="abcde"
echo ${VALUE}
echo ${STRING}
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
123
abcde
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
3)只读变量:在变量名前加readonly
关键字,使该变量无法被改变
#!/bin/bash
VALUE=123
readonly VALUE
VALUE=456
echo ${VALUE}
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
./shelltest.sh: 行 4: VALUE:只读变量
123
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
4)删除变量:在变量名前加unset
关键字,使变量无法使用(unset
不能删除只读变量)
#!/bin/bash
VALUE=123
unset VALUE
echo ${VALUE}
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
2.2、变量类型
2.2.1、字符串
可以用单引号和双引号定义字符串变量,两者使用上有区别,更简易用双引号,区别如下:
-
双引号里可以有变量,单引号里不行
-
双引号里可以出现转义字符使用特殊符号,但单引号不行
1)拼接字符串:
#!/bin/bash
STR1="hello "
STR2="world!"
STR3="${STR1}${STR2}"echo ${STR3}
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
hello world!
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
2)获取字符串长度:变量名前加#
号
#!/bin/bash
STR3="hello world!"#运行结果为12
echo ${#STR3}
3)提取子字符串:变量名后跟:数字:数字
#!/bin/bash
STR3="hello world!"#运行结果为:ello worl
echo ${STR3:1:9}
2.2.2、整数
整数变量定义格式为:变量名=值
,前面有列举过,关于变量的使用后续详细介绍。
#!/bin/bash
VALUE=123
echo ${VALUE}
2.2.3、数组
1)数组定义格式:数组名=(值1 值2 ... 值n)
#!/bin/bash
VALUE=("TEST1" "TEST2" "TEST3")
也可以分开进行赋值
#!/bin/bash
VALUE[0]="TEST1"
VALUE[1]="TEST2"
VALUE[2]="TEST3"
2)数组访问格式:${数组名[下标]}
#!/bin/bash
VALUE[0]="TEST1"
VALUE[1]="TEST2"
VALUE[2]="TEST3"#运行结果为:TEST1
echo ${VALUE[0]}
使用**@** 符号可以获取数组中的所有元素,例如:
#!/bin/bash
VALUE[0]="TEST1"
VALUE[1]="TEST2"
VALUE[2]="TEST3"#运行结果为:TEST1 TEST2 TEST3
echo ${VALUE[@]}
2)获取数组元素的个数
#!/bin/bash
VALUE=("TEST1" "TEST2" "TEST3")#运行结果为:3
echo ${#VALUE[@]}
3)获取数组单个元素长度
#!/bin/bash
VALUE=("TEST1" "TEST2" "TEST3")#运行结果为:5
echo ${#VALUE[0]}
2.2.4、环境变量
由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。例如,PATH 变量包含了操作系统搜索可执行文件的路径:
#!/bin/bash
echo $PATH
运行结果为:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
2.2.5、特殊变量
有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1, 2 ∗ ∗ , 等表示脚本的参数。 ∗ ∗ 2**, 等表示脚本的参数。** 2∗∗,等表示脚本的参数。∗∗#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等,第三章详细举例。
三、Shell传递参数
shell脚本执行时也是允许传递参数的,格式为:./脚本名 参数1 参数2 参数n
,例如:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh 1 2 3
下表为shell提供的参数处理字符:
参数处理 | 说明 |
---|---|
$n | n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,依此类推 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相同,但是使用时加引号,并在引号中返回每个参数。如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
脚本示例:
#!/bin/bashecho "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
echo "传递参数个数:$#"
echo "所有传递参数:$*"
echo "所有传递参数:$@"
echo "脚本运行当前进程ID:$$"
echo "后台运行的最后一个进程ID:$!"
echo "shell使用的当前选项:$-"
echo "最后命令的退出状态:$?"
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh a b c
第一个参数为:a
第二个参数为:b
第三个参数为:c
传递参数个数:3
所有传递参数:a b c
所有传递参数:a b c
脚本运行当前进程ID:4340
后台运行的最后一个进程ID:
shell使用的当前选项:hB
最后命令的退出状态:0
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
四、Shell运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。例如:使用expr计算两数之和
1 #!/bin/bash2 3 val=`expr 2 + 2`##运行结果为:两数之和为 : 44 echo "两数之和为 : $val"
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被
4.1、算数运算符
下表列出了常用的算术运算符,假定变量 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。 |
注意:
-
条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
-
乘号(*)为特殊字符,前边必须加反斜杠()才能实现乘法运算;
4.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
4.3、布尔运算符
下表列出了常用的布尔运算符,假定变量 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。 |
4.4、字符串运算符
下表列出了常用的字符串运算符,假定变量 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。 |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
4.5、文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性,属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
4.6、逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
4.7、自增和自减操作符
4.7.1、使用 let 命令
let 命令允许对整数进行算术运算。
#!/bin/bash
num=5# 自增
let num++
echo $num# 自减
let num--
echo $num
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
6
5
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
4.7.2、使用 $(( )) 进行算术运算
$(( )) 语法也是进行算术运算的一种方式。
#!/bin/bash
num=5# 自增
num=$((num + 1))
echo $num# 自减
num=$((num - 1))
echo $num
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
6
5
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
4.7.3、使用 expr 命令
expr 命令可以用于算术运算,但在现代脚本中不如 let 和 $(( )) 常用。
#!/bin/bash
num=5# 自增
num=$(expr $num + 1)
echo $num# 自减
num=$(expr $num - 1)
echo $num
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
6
5
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
4.7.4、使用 (( )) 进行算术运算
与 $(( )) 类似,(( )) 语法也可以用于算术运算。
#!/bin/bash
num=5# 自增
((num++))
echo $num# 自减
((num--))
echo $num
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
6
5
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
五、echo命令
5.1输出特殊字符
shell中有些字符是具有特殊含义的,比如双引号(“”),在shell中被它括起来的内容为字符串。但有时候我们不想让它具有特殊含义,只想让它作为普通的字符来用该怎么办呢?答:在符号前加转义字符\
。
#!/bin/bash
#输出结果:我要输出双引号
echo "我要输出双引号"""#输出结果:我要输出双引号""
echo "我要输出双引号\"\""
如上面的例子,想要通过echo输出一对双引号,第一种直接加""
的方式是不行的,要使用第二种方式在双引号前加转义字符。类似这种符号还有很多,比如:#
\ "" $ # @ | &
等等。PS:博主之前就因为这个踩过坑,当时做的设备有一个SNMP的配置页面,用户可以通过配置页面给设备下发SNMP的用户名和密码,设备拿到用户名和密码以后通过shell脚本写到配置里(大概是这样,时间长有点记不清了)。不知哪个天才用户把用户名和密码设置成了:`reboot`,在shell中 `` 中的内容会被当做命令执行,刚好reboot是linux下的重启命令,这就导致用户一下发用户名和密码设备就重启了。
5.2输出内容到文件
下面例子是将echo后面的内容输出到testfile文件里
#!/bin/bash
echo "this is shell test" > testfile
5.3输出命令执行结果
下面例子是将pwd命令执行后的结果输出
#!/bin/bash
echo "`pwd`"
六、printf命令
6.1、printf用法及规则
printf功能和echo相同,都是打印输入,但是printf比echo移植性好一些,根据自己需求选择使用哪一个。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,需要我们可动添加 \n。
printf 命令的语法(格式基本和C语言的printf一致):
printf format-string [arguments...]
参数说明:
- format-string: 一个格式字符串,它包含普通文本和格式说明符。
- arguments: 用于填充格式说明符的参数列表。。
格式说明符由 % 字符开始,后跟一个或多个字符,用于指定输出的格式。常用的格式说明符包括:
-
%s
:字符串 -
%d
:十进制整数 -
%f
:浮点数 -
%c
:字符 -
%x
:十六进制数 -
%o
:八进制数 -
%b
:二进制数 -
%e
:科学计数法表示的浮点数
示例:第五行打印“this is my shelltest”,第六行打印VALUE的值
#!/bin/bashVALUE=10printf "%s %s %s %s\n" this is my shelltest
printf "%d\n" $VALUE
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
this is my shelltest
10
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
6.2、printf转义符
printf中有些字符是有特殊含义的,例如**\r是换行,\n**是回车,下面列出一些其他的转义字符
序列 | 说明 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
七、test命令
shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
7.1数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
7.1、数值测试
假定变量 a 为 10,变量 b 为 20:
参数 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | test $[a] -eq $[b] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | test $[a] -ne $[b] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | test $[a] -gt $[b] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | test $[a] -lt $[b] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | test $[a] -ge $[b] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | test $[a] -le $[b] 返回 true。 |
7.2、字符串测试
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
参数 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | test $a = $b 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | test $a != $b 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | test -z $a 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | test -n $a 返回 true。 |
7.3、文件测试
参数 | 说明 | 举例 |
---|---|---|
-e 文件名 | 如果文件存在则为真 | test -e $file 返回 true。 |
-r 文件名 | 如果文件存在且可读则为真 | test -e $file 返回 true。 |
-w 文件名 | 如果文件存在且可写则为真 | test -w $file 返回 true。 |
-x 文件名 | 如果文件存在且可执行则为真 | test -x $file 返回 true。 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 | test -s $file 返回 true。 |
-d 文件名 | 如果文件存在且为目录则为真 | test -d $file 返回 false。 |
-f 文件名 | 如果文件存在且为普通文件则为真 | test -f $file 返回 true。 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 | test -c $file 返回 false。 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 | test -b $file 返回 false。 |
八、流程控制
8.1、if语句
语法格式:
if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi
示例:
#!/bin/bash
a=10
b=20
if [ $a == $b ]
thenecho "a 等于 b"
elif [ $a -gt $b ]
thenecho "a 大于 b"
elif [ $a -lt $b ]
thenecho "a 小于 b"
elseecho "没有符合的条件"
fi
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
a 小于 b
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.2、for循环
当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。
语法格式:
for var in item1 item2 ... itemN
docommand1command2...commandN
done
示例:变量列表里有"pwd"、“ls”、"cat shelltest.sh"共3条命令,使用for循环遍历列表执行这三条命令。
#!/bin/bashfor A in "pwd" "ls" "cat shelltest.sh"
doecho "`${A}`"
6 done
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
/mnt/hgfs/UbuntuRK3568/03_ShellTest
shelltest.sh
testfile
#!/bin/bashfor A in "pwd" "ls" "cat shelltest.sh"
doecho "`${A}`"
done
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.3、while循环
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:
while condition
docommand
done
示例:当VALUE值小于5时,循环输出VALUE的值,循环每执行一,VALUE值加1
#!/bin/bashVALUE=1while [ $VALUE -lt 5 ]
doecho "input VALUE is $VALUE"let VALUE++
done
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
VALUE is 1
VALUE is 2
VALUE is 3
VALUE is 4
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.4、until循环
until 循环与 while 循环在处理方式上刚好相反,until 循环执行一系列命令直至条件为 true 时停止,语法格式为:
until condition
docommand
done
示例:当VALUE值不等于5时,循环输出VALUE的值,循环每执行一,VALUE值加1
#!/bin/bashVALUE=1until [ $VALUE -eq 5 ]
doecho "VALUE is $VALUE"let VALUE++
done
执行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
VALUE is 1
VALUE is 2
VALUE is 3
VALUE is 4
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.5、case … esac
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case … esac 语法格式如下:
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
示例:通过键盘输入一个1-3的数字,匹配输出对应的内容,如果不在1-3的范围输出err
#!/bin/bashread VALUEcase $VALUE in1) echo "input num is 1";;2) echo "input num is 2";;3) echo "input num is 3";;*) echo "inpt err num";;
esac
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
1
input num is 1
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.6、跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:break 和 continue
8.6.1、break
break 命令允许跳出所有循环(终止执行后面的所有循环)。
示例:循环每执行一次VALUE加1,从1-10的数字中匹配VALUE等于5的条件,当VALUE等于5时退出循环
#!/bin/bashVALUE=0while [ $VALUE -lt 10 ]
doif [ $VALUE -eq 5 ]thenecho "find VALUE is $VALUE"breakfilet VALUE++echo "VALUE is $VALUE"
done
运行结果
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
VALUE is 1
VALUE is 2
VALUE is 3
VALUE is 4
VALUE is 5
find VALUE is 5
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
8.6.2、continue
continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
示例代码:循环每执行一次VALUE加1,从1-10的数字中匹配VALUE等于5的条件,当VALUE等于5时跳出当前循环
#!/bin/bashVALUE=0while [ $VALUE -lt 10 ]
doif [ $VALUE -eq 5 ]thenecho "find VALUE is $VALUE"continuefilet VALUE++echo "VALUE is $VALUE"
done
运行结果:由于VALUE的值为5时跳出了当前循环,导致后面VALUE自加每执行,VALUE值一直为5,一直输出“find VALUE is 5”
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
VALUE is 1
VALUE is 2
VALUE is 3
VALUE is 4
VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
find VALUE is 5
九、函数
9.1、函数格式
[ function ] funname [()]
{action;[return int;]
}
说明:
1、可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 数值范围 n(0-255)。
3、所有函数在使用前必须定义,即必须将函数放在脚本开始部分,调用函数仅使用其函数名即可。
示例:
#!/bin/bashtestfunc()
{echo "this is testfunc"
}testfunc
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
this is testfunc
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
9.2、参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数, 2 表示第二个参数, 2表示第二个参数, 2表示第二个参数,n表示第n个参数。
示例:
#!/bin/bashtestfunc()
{echo "first param is $1"echo "second param is $2"echo "third param is $3"
}testfunc 100 200 300
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
first param is 100
second param is 200
third param is 300
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
注意: 获取第10个及以上参数时使用 n 获取,如: {n}获取,如: n获取,如:{10}表示获取第十个参数,${n}表示获取第n个参数
shell中还有几个特殊字符用来处理函数参数,与shell脚本入参相同,见第三章shell传递参数
9.3、返回值
1、使用return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
2、使用**$?**获取函数返回值
示例:
#!/bin/bashtestfunc()
{return 10
}testfunc
echo "testfunc return: $?"
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
testfunc return: 10
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
十、输入、输出重定向
10.1、输出重定向
正常情况下,我们在linux 终端执行一个命令或脚本后系统默认会将执行结果返回到终端。如果我们不想将执行结果返回给终端,而是返回到文件中,那我们就需要将输出重定向。
示例:将date命令的执行结果输出到file.txt中
#!/bin/bashecho `date` > file.txt
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ cat file.txt
2025年 02月 07日 星期五 16:01:39 CST
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
注意: 使用>重定向每次会将文件清空再写入,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
#!/bin/bashecho `date` >> file.txt
10.2、输入重定向
和输入重定向一样,假如我们想将文件作为命令的输入,我们可以用输入重定向。
示例:创建1个文本文件file.txt,再创建一个脚本shelltest.sh,在shelltest.sh脚本中通过read命令读取file.txt中的内容并输入
file.txt内容:
10
注:file.txt文件末尾有换行
shelltest.sh代码:
#!/bin/bashread VALUE < ./file.txtecho "input VALUE is $VALUE"
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ cat file.txt
10user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
input VALUE is 10
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
10.3、补充知识
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR),经常在别人的脚本中看到如下代码:
command > /dev/null 2>&1
1、/dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果
2、2>&1
2>&1,这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。
所以在命令后加了**> /dev/null 2>&1**,表示执行该条命令后将不会输出任何信息到终端,也不会有任何信息输出到文件中。
十一、文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
. filepath/filename # 注意点号(.)和文件路径中间有一空格
或
source filename
示例:创建2个脚本,第一个为test1.sh,第二个为shelltest.sh,在shelltest.sh打印test1.sh中的变量VALUE
test1.sh代码如下:
#!/bin/bashVALUE=100
shelltest.sh代码如下:
#!/bin/bash. ./test1.shecho "test1.sh VALUE=$VALUE"
运行结果:
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$ ./shelltest.sh
test1.sh VALUE=100
user@root:/mnt/hgfs/UbuntuRK3568/03_ShellTest$
相关文章:
shell脚本学习笔记
Shell脚本学习笔记 参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...
Java中的线程池及其应用场景有哪些?
Java中的线程池是一种高效的并发编程机制,通过复用线程来管理任务的执行,从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例,帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...
13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍
LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...
构建基于 SSE 协议通信的 MCP Server 和 Client
在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出&a…...
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...
第3章 使用 Vue 脚手架
第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...
MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...
pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题
目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习: 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...
ai智能DeepSeek 在 Cursor 中的配置与应用实践
DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…...
登录到docker里
在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...
【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...
Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
10.单例模式 (Singleton Pattern)
单例模式的定义 单例模式(Singleton Pattern) 是一种创建型设计模式,确保一个类在整个程序生命周期中只能有一个实例,并提供一个全局访问点。 特点: 唯一性:保证系统中某个类只能有一个实例。全局访问点…...
Docker 常见问题解决方法
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…...
QT-面试
1. C(特别是 Qt)开发中,内存优化的方法 1. 合理管理对象生命周期,使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期,避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...
使用java代码操作rabbitMQ收发消息
SpringAMQP 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与RabbitMQ交互。并且RabbitMQ官方也…...
LeetCode 128: 最长连续序列
LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums […...
Shapefile格式文件解析和显示
Java实现GIS SHP文件格式的解析和显示,JDK19下编译,awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中,解析见:DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码: public static Shap…...
华为昇腾Altas产品查询——常用命令汇总记录
参考链接: 【2024第一期CANN训练营】Altas产品查询CANN软件包版本等信息npu-smi Atlas 中心训练服务器 6.0.0 NPU驱动和固件安装指南 06 Ascend Extension for PyTorch插件软件版本配套表 以下操作适用于查询npu设备的基本信息。 #查询所有设备的基本信息 npu-smi…...
韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系
韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系 在当今这个科技日新月异的时代,企业之间的竞争早已超越了单纯的产品质量比拼,**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...
【R语言】plyr包和dplyr包
一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”(split-apply-combine)策略。此策略是指将一个问题分割成更容易操作的部分,再对每一部分进行独立的操作,最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...
开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。
一、明确游戏定位与核心玩法 游戏类型 MOBA(Multiplayer Online Battle Arena):强调团队合作、策略性和即时战斗。确定游戏模式(如5v5、3v3等)和地图设计。 核心玩法 角色设计:英雄技能、属性、成长曲线。…...
harmonyOS生命周期详述
harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...
Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问
1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型,您可以按照以下步骤进行操作: 步骤 1:安装 Ollama 安装 Ollama: 使用以下命令安装 Ollama: curl -sSfL https://ollama.com/download.…...
ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
前言:在开发过程中,几乎踩便了所有大坑小坑总结出的文章,我是把坑踩满了,帮助更过小白快速上手,如有错误之处,还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能: 模组启动模…...
【蓝桥杯嵌入式】4_key:单击+长按+双击
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 将4个按键的引脚设置为input,并将初始状态设置为Pull-up(上拉输入) 为解决按键抖动的问题,我们…...
TCP队头阻塞问题以及QUIC解决方案
TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...
idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...
如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例
在当今数据驱动的商业环境中,获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而,像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序,获取eBay商品的销量详情…...
激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU
本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归:Sigmoid函数在分类问题中的应用 整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元&a…...
算法基础之八大排序
文章目录 概要1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希尔排序(Shell Sort)5. 归并排序(Merge Sort)6. 快速排…...
通达OA /mysql/index.php 未授权访问漏洞
通达OA /mysql/index.php 未授权访问漏洞 漏洞描述 通达OA 未授权访问phpmyadmin漏洞,攻击者无需帐号密码可直接访问phpmyadmin,造成数据库泄漏。攻击者可操作数据库执行sql语句,执行恶意操作,进行一步攻击。 威胁等级: 高危 …...
每日学习 设计模式 五种不同的单例模式
狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...
C++类和对象
目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...
AI知识库和全文检索的区别
1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统,能够理解、推理和生成信息。它的核心作用包括: 1.1 语义理解 自然语言处理(NLP):AI知识库能够理解用户查询的语义,而不仅仅是关键词匹配。 …...
docker常用命令及案例
以下是 Docker 的所有常用命令及其案例说明,按功能分类整理: 1. 镜像管理 1.1 拉取镜像 命令: docker pull <镜像名>:<标签>案例: 拉取官方的 nginx 镜像docker pull nginx:latest1.2 列出本地镜像 命令: docker images案例: 查看本地所有…...
webpack【初体验】使用 webpack 打包一个程序
打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...
让office集成deepseek,支持office和WPS办公软件!(体验感受)
导读 AIGC:AIGC是一种新的人工智能技术,它的全称是Artificial Intelligence Generative Content,即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术,能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...
初始数据结构☞复杂度与泛式
一.时间复杂度 定义: 算法的时间复杂度是一个数学函数,算法中的基本操作的执行次数,为算法的时间复杂度。 O渐进表示方法: 原因: 计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而…...
理解UML中的四种关系:依赖、关联、泛化和实现
在软件工程中,统一建模语言(UML)是一种广泛使用的工具,用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型,如类图、用例图、序列图等,帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...
go语言中的反射
为什么会引入反射 有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射。 空接口可…...
【前端】打造自己的hexo博客_hexo一本通
今日更新完毕,建议关注收藏点赞! 目录 打造自己的hexo blog挂载到自己的github主页设计自己的theme 打造自己的hexo blog #需要安装git node.js 这里略#安装hexo npm install -g hexo-cli npm install hexo hexo help#<folder>必须是空的 hexo in…...
剪辑学习整理
文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么?剪辑分为哪些种类? https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...
储能系统-系统架构
已更新系列文章包括104、61850、modbus 、单片机等,欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统(BESS) 架构 电池储能系统主要包括、电池、pcs、本地控制…...
程序员也可以这样赚钱
最近有朋友和我交流了关于程序员副业的想法,我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐,结合政策合规性、平台口碑及实际操作性整理,覆盖国内外主流选择: 一、国内综合型平台 程序…...
STM32启动过程概述
1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始,到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...
Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗
Elasticsearch 本身并不直接收集目标服务器的日志,它主要用于存储、搜索和分析数据。要收集目标服务器的日志,通常会借助其他工具,并且一般不需要在目标服务器上安装 Elasticsearch 软件,常见的日志收集方案: Filebeat…...
Linux:软硬链接和动静态库
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:软硬链接和动静态库》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞࿰…...
C# 比较两个List集合内容是否相同
在 C# 中,要比较两个 List<T> 集合的内容是否相同,可以通过以下几种方法: 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法(顺序和内容都相等) 顺序和内容都相等:使用 SequenceEqual。 usin…...
IDEA中Resolving Maven dependencies卡着不动解决方案
一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现。以下是具体步骤: 1、找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、编辑se…...