当前位置: 首页 > news >正文

Shell脚本的学习

编写脚本文件

定义以开头:#!/bin/bash

#!用来声明脚本由什么shell解释,否则使用默认shel

第一步:编写脚本文件

#!/bin/bash
#注释
echo "这是输出"
第二步:加上执行权限:chmod +x 脚本文件名.sh
第三步:运行程序

./xxx.sh :先按照 文件中#!指定的解析器解析,如果#!指定指定的解析器不存在 才会使用系统默认的解析器

bash xxx.sh:指明先用bash解析器解析,如果bash不存在 才会使用默认解析器

. xxx.sh 直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的

shell学习

变量

定义变量:变量名=变量值

如:num=10      #等号两侧避免使用空格

引用变量:$变量名

echo $num         #输出10  
echo ${num}        #推荐给所有变量加上花括号

unset :清除变量值

unset $num       #unset 命令不能删除只读变量
echo $num         #输出空

read:从键盘获取输入

read  num
echo "num=$num"

在一行上显示和添加提示 需要加上-p

read -p  “请输入Num的值:" num
echo "num=$num"

readonly:只读变量,只读变量的值不能被改变

环境变量 :

这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。

例如,PATH 变量包含了操作系统搜索可执行文件的路径:

echo $PATH

特殊变量: 

$0 表示脚本的名称
$1, $2, 等表示脚本的参数
$#表示传递给脚本的参数数量
$? 表示上一个命令的退出状态等。

整数变量

在一些Shell中,你可以使用 declare 或 typeset 命令来声明整数变量。

declare -i my_integer=42

这样的声明告诉 Shell 将 my_integer 视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。

数组变量:

数组可以是整数索引数组或关联数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

定义数组:

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
#整数索引数组
my_array=(1 2 3 4 5)
#关联数组
declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

读取数组:

读取数组元素值的一般格式是:

${数组名[下标]}
valuen=${array_name[n]}
#使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

获取数组的长度:

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}

关联数组:

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。

关联数组使用 declare 命令来声明,语法格式如下:

declare -A array_name

-A 选项就是用于声明一个关联数组。关联数组的键是唯一的。

declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

通过键来访问关联数组的元素:

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo ${site["runoob"]}

执行脚本,输出结果如下所示:
www.runoob.com

获取数组中的所有元素:

使用 @ 或 * 可以获取数组中的所有元素,例如:

#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

在数组前加一个感叹号 ! 可以获取数组的所有键,例如:

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo "数组的键为: ${!site[*]}"
echo "数组的键为: ${!site[@]}"

#执行脚本,输出结果如下所示:

数组的键为: google runoob taobao
数组的键为: google runoob taobao

Shell 字符串

单引号

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为:

Hello, I know you are "runoob"! 

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度

变量为字符串时,${#string} 等价于 ${#string[0]}:

string="abcd"
echo ${#string}   # 输出 4
echo ${#string[0]}   # 输出 4

提取子字符串

从字符串索引值为 1字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):脚本中 ` 是反引号,而不是单引号 '

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4(第四个不是下标)

Shell 注释

以 # 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释

多行注释

使用 Here 文档

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

: <<'COMMENT'
这是注释的部分。
可以有多行内容。
COMMENT

:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

Shell 传递参数

向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径),$1 表示第一个参数,$2 表示第二个参数,依此类推:

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

特殊字符用来处理参数:

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

#执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

#执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

Shell 基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"

#执行脚本,输出结果如下所示:
两数之和为 : 4

两点注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符

假定变量 a 为 10,变量 b 为 20:

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

#!/bin/bash

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

#执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
  • if...then...fi 是条件语句。
  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

关系运算符

假定变量 a 为 10,变量 b 为 20:

#!/bin/bash

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

#执行脚本,输出结果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布尔运算符

假定变量 a 为 10,变量 b 为 20:

#!/bin/bash

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

#执行脚本,输出结果如下所示:

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

逻辑运算符

假定变量 a 为 10,变量 b 为 20:

#!/bin/bash

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

#执行脚本,输出结果如下所示:

返回 false
返回 true

字符串运算符

假定变量 a 为 "abc",变量 b 为 "efg":

#!/bin/bash

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

#执行脚本,输出结果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。

变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

#!/bin/bash

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

#执行脚本,输出结果如下所示:

文件可读
文件可写
文件可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在

自增和自减操作符

尽管 Shell 本身没有像 C、C++ 或 Java 那样的 ++ 和 -- 操作符,但可以通过其他方式实现相同的功能。以下是一些常见的方法:

使用 let 命令

let 命令允许对整数进行算术运算。

#!/bin/bash
# 初始化变量
num=5
# 自增
let num++
# 自减
let num--
echo $num

使用 $(( )) 进行算术运算

$(( )) 语法也是进行算术运算的一种方式。

#!/bin/bash
# 初始化变量
num=5
# 自增
num=$((num + 1))
# 自减
num=$((num - 1))
echo $num

使用 expr 命令

expr 命令可以用于算术运算,但在现代脚本中不如 let 和 $(( )) 常用。

#!/bin/bash
# 初始化变量
num=5
# 自增
num=$(expr $num + 1)
# 自减
num=$(expr $num - 1)
echo $num

使用 (( )) 进行算术运算

与 $(( )) 类似,(( )) 语法也可以用于算术运算。

#!/bin/bash
# 初始化变量
num=5
# 自增
((num++))
# 自减
((num--))
echo $num

Shell echo命令

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:

echo string

您可以使用echo实现更复杂的输出格式控制。

1.显示普通字符串:

echo "It is a test"
#这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo It is a test

2.显示转义字符

echo "\"It is a test\""
结果将是:
"It is a test"
同样,双引号也可以省略

3.显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"

以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

4.显示换行

echo -e "OK! \n" # -e 开启转义
echo "It is a test"

#输出结果:

OK!It is a test

5.显示不换行

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

#输出结果:

OK! It is a test

6.显示结果定向至文件

echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'
#输出结果:
$name\"

8.显示命令执行结果

echo `date`
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014

注意: 这里使用的是反引号 `, 而不是单引号 '。

Shell printf 命令

默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

printf 命令的语法:

printf  format-string  [arguments...]

参数说明:

  • format-string: 一个格式字符串,它包含普通文本和格式说明符。
  • arguments: 用于填充格式说明符的参数列表。。

格式说明符由 % 字符开始,后跟一个或多个字符,用于指定输出的格式。常用的格式说明符包括:

  • %s:字符串
  • %d:十进制整数
  • %f:浮点数
  • %c:字符
  • %x:十六进制数
  • %o:八进制数
  • %b:二进制数
  • %e:科学计数法表示的浮点数

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中 .2 指保留 2 位小数。

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

#执行脚本,输出结果如下所示:

姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99


# format-string为双引号
printf "%d %s\n" 1 "abc"

# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"

# 没有引号也可以输出
printf %s abcdef

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

#执行脚本,输出结果如下所示:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  and 0

printf 的转义序列

$ printf "a string, no processing:<%s>\n" "A\nB"
a string, no processing:<A\nB>

$ printf "a string, no processing:<%b>\n" "A\nB"
a string, no processing:<A
B>

$ printf "www.runoob.com \a"
www.runoob.com $                  #不换行

Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输出结果:
两个数相等!

代码中的 [] 执行基本的算数运算,如:

#!/bin/bash
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

结果为:
result 为: 11

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

#输出结果:

两个字符串不相等!

cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

输出结果:

文件已存在!

Shell 流程控制

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
 

if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt。

if [ "$a" -gt "$b" ]; then...
fi

如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <。

if (( a > b )); then...
fi

for 循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
 

当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

#输出结果:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:

#!/bin/bashfor str in This is a string
doecho $str
done

#输出结果:

This
is
a
string

while 语句

while condition
do
    command
done

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
 

#运行脚本,输出:

1
2
3
4
5

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

#运行脚本,输出类似下面:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:菜鸟教程
是的!菜鸟教程 是一个好网站

无限循环

无限循环语法格式:

while :
docommand
done

#或者

while true
docommand
done

#或者

for (( ; ; ))

until 循环

condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

case ... esac

多选择语句,语法格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
 

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

下面的脚本提示输入 1 到 4,与每一种模式进行匹配:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

#输入不同的内容,会有不同的结果,例如:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

跳出循环

break 命令

break 命令允许跳出所有循环(终止执行后面的所有循环)。

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

#执行以上代码,输出结果为:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

continue

continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

Shell 函数

[ function ] funname [()]

{

    action;

    [return int;]

}

说明:

  • 1、可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255).

#!/bin/bash
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

#输出类似下面:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

注意: return 语句只能返回一个介于 0 到 255 之间的整数,而两个输入数字的和可能超过这个范围。

要解决这个问题,可以修改 return 语句,直接使用 echo 输出和而不是使用 return:

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    sum=$(($aNum + $anotherNum))
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    echo $sum  # 输出两个数字的和
}

函数参数

#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

#输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

Shell 输入/输出重定向

文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

>:以覆盖的方式写入,>>:以追加的方式写入

输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
菜鸟教程:www.runoob.com

输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

接着以上实例,我们需要统计 users 文件的行数,执行以下命令:

$ wc -l users #wc:用于统计文件的行数、单词数或字节数。-l:选项(lines),表示统计行数。
2 users       #2:表示文件 users中共有 2 行内容。users:被统计的文件名。

#也可以将输入重定向到 users 文件:

$  wc -l < users
2          #2:表示文件 users中共有 2 行内容

注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

如果希望 stderr 重定向到 file,可以这样写:

$ command 2>file
$ command 2>>file

如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

$ command > file 2>&1#或者$ command >> file 2>&1

其中 2>&1

  • 2> 表示重定向标准错误(stderr,文件描述符2)

  • &1 表示将标准错误指向标准输出当前的位置(即 file)。

  • 最终效果是:标准错误也被写入 file,且和标准输出混合在一起。


等效写法

以下两种写法与 command > file 2>&1 完全等价:

  1. command &> file
    (Bash 等现代 Shell 支持的简洁写法,直接重定向所有输出)

  2. command >> file 2>&1
    >> 表示追加到文件末尾,而非覆盖)

Here Document

command << delimiterdocument
delimiter

    它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

    注意:

    • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
    • 开始的delimiter前后的空格会被忽略掉。

    在命令行中通过 wc -l 命令计算 Here Document 的行数:

    $ wc -l << EOF欢迎来到菜鸟教程www.runoob.com
    EOF
    3          # 输出结果为 3 行
    $
    
    我们也可以将 Here Document 用在脚本中,例如:
    #!/bin/bash
    cat << EOF
    欢迎来到
    菜鸟教程
    www.runoob.com
    EOF

    #执行以上脚本,输出结果:

    欢迎来到
    菜鸟教程
    www.runoob.com

    /dev/null 文件

    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

    $ command > /dev/null

    /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

    如果希望屏蔽 stdout 和 stderr,可以这样写:

    $ command > /dev/null 2>&1
    

    注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

    这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。

    Shell 文件包含

    Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

    . filename   # 注意点号(.)和文件名中间有一空格或source filename

    创建两个 shell 脚本文件。

    test1.sh 代码如下:

    #!/bin/bash
    url="http://www.runoob.com"

    test2.sh 代码如下:

    #!/bin/bash
    #使用 . 号来引用test1.sh 文件
    . ./test1.sh# 或者使用以下包含文件代码
    # source ./test1.shecho "菜鸟教程官网地址:$url"

    接下来,我们为 test2.sh 添加可执行权限并执行:

    $ chmod +x test2.sh 
    $ ./test2.sh 
    菜鸟教程官网地址:http://www.runoob.com
    

    注:被包含的文件 test1.sh 不需要可执行权限。

    相关文章:

    Shell脚本的学习

    编写脚本文件 定义以开头&#xff1a;#!/bin/bash #!用来声明脚本由什么shell解释&#xff0c;否则使用默认shel 第一步&#xff1a;编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步&#xff1a;加上执行权限&#xff1a;chmod x 脚本文件名.sh 第三步&…...

    Java——pdf增加水印

    文章目录 前言方式一 itextpdf项目依赖引入编写PDF添加水印工具类测试效果展示 方式二 pdfbox依赖引入编写实现类效果展示 扩展1、将inputstream流信息添加水印并导出zip2、部署出现找不到指定字体文件 资料参考 前言 近期为了知识库文件导出&#xff0c;文件数据安全处理&…...

    Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案

    在现代的高性能应用开发中&#xff0c;Redis作为一款极为热门的内存数据库&#xff0c;其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而&#xff0c;在实际使用过程中&#xff0c;处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存…...

    深入 C++ 线程库:从创建到同步的探索之旅

    C在<thread>中定义了C线程库. 创建多线程 #include <iostream> #include <thread> using namespace std; void show(int id, int count) { //线程函数for (int i 0; i < count; i) {cout << "id:" << id << ",值:&qu…...

    LangChain使用大语言模型构建强大的应用程序

    LangChain简介 LangChain是一个强大的框架&#xff0c;旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#xff…...

    程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析

    程序化广告行业&#xff08;72/89&#xff09;&#xff1a;Tag Manager系统代码操作与行业发展剖析 大家好&#xff01;在技术领域不断探索的过程中&#xff0c;我深刻体会到知识共享的重要性。写这篇博客&#xff0c;就是希望能和大家一起深入了解程序化广告行业&#xff0c;…...

    数据结构实验3.3:求解迷宫路径问题

    文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析&#xff08;一&#xff09;整体思路&#xff08;二&#xff09;详细步骤1. 输入迷宫大小并生成迷宫2. 定义走步规则3. 深度优先搜索&#xff08;DFS&#xff09;4. 输出结果 &#xff08;三&…...

    基于SpringBoot的线上历史馆藏系统【附源码】

    基于SpringBoot的线上历史馆藏系统&#xff08;源码L文说明文档&#xff09; 4 系统设计 系统在设计的过程中&#xff0c;必然要遵循一定的原则才可以&#xff0c;胡乱设计是不可取的。首先用户在使用过程中&#xff0c;能够直观感受到功能操作的便利性&#xff0c;符合…...

    Mybatis的springboot项目使用

    删除数据 & 占位符 一般常用占位符进行数据库操作&#xff0c;也就是预编译sql。 在UserMapper中定义删除接口 /** 根据id删除用户*/ Delete("delete from user where id #{id}") void deleteById(Integer id);若想要获取返回值&#xff0c;声明为Integer (s…...

    网站集群批量管理-Ansible剧本与变量

    复盘内容&#xff1a;链接指北 查看ansible命令文档 ansible-doc -s systemd一、剧本 何为剧本: playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 剧本yaml格式,yaml格式的文件:空格,冒号. 剧本未来我们批量管理,运维必会的内容. …...

    HOW - React Developer Tools 调试器

    目录 React Developer Tools使用Components 功能特性1. 查看和编辑 props/state/hooks2. 查找组件3. 检查组件树4. 打印组件信息5. 检查子组件 Profiler 功能特性Commit ChartFlame Chart 火焰图Ranked Chart 排名图 why-did-you-render 参考文档&#xff1a; React调试利器&a…...

    Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

    一、引言 在微服务架构中&#xff0c;服务发现、配置管理、流量控制是保障系统稳定性的核心问题。Spring Cloud Netflix 生态曾主导微服务解决方案&#xff0c;但其部分组件&#xff08;如 Eureka、Hystrix&#xff09;已进入维护模式。 Spring Cloud Alibaba 凭借 高性能、轻…...

    《AI换脸时代的攻防暗战:从技术滥用走向可信未来》

    技术迭代图谱 过去五年里&#xff0c;Deepfake技术经历了飞速迭代&#xff0c;从最初的萌芽到如今的广泛应用和对抗措施形成。2017年前后&#xff0c;利用深度学习进行人脸换装的技术首次在社区中出现。一位Reddit网友昵称“deepfakes”&#xff0c;将名人面孔替换到色情影片上…...

    25/4/9 算法笔记 DBGAN+强化学习+迁移学习实现青光眼图像去模糊1

    整体实验介绍 实验主要是结合DBGAN对抗网络强化学习增强迁移学习增强实现青光眼图像去模糊。今天则是先完成了DBGAN板块模型的训练。 实验背景介绍 青光眼的主要特征有&#xff1a; 视盘形态与杯盘比CDR&#xff1a;青光眼患者主要表现为视杯扩大&#xff0c;盘沿变窄。 视…...

    【Claude AI大语言模型连接Blender生成资产】Windows安装Blender MCP教程

    前言 最近在学习资产制作&#xff0c;了解到了个好玩的东西&#xff0c;利用AI一步一步搭建资产&#xff1a; 上面这副图就是利用Claude AI调用Blender的Python接口一步一步实现的&#xff0c;挺丑但好玩。 安装教程 进入Github: Blender-MCP 网站&#xff0c;下载该项目&a…...

    JSP运行环境安装及常用HTML标记使用

    制作一个静态网站的基本页面index.html 实验代码&#xff1a;<form> <label for"username">用户名:</label> <input type"text" id"username" name"username"><br> <label for"password&…...

    Git 的进阶功能和技巧

    1、分支的概念和使用 1.1、什么是分支&#xff1f; 分支&#xff08;Branch&#xff09;是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中&#xff0c;分支是 Git 强大功能之一&#xff0c;它允许我们从主开发线分离出来&#xff0c;在不…...

    WSL1升级到WSL2注意事项

    今天要在WSL上安装docker&#xff0c;因为机器上安装了wsl1&#xff0c;docker安装后启动不了&#xff0c;通过询问deepseek发现docker只能在wsl2上安装&#xff0c;因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10&#xff08;版本 1903 及以上&…...

    392. 判断子序列

    https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150因为是子序列我们只要关心后一个字符在前一个字符后面出现过就行&#xff0c;至于在哪出现出现几次我们不关心&#xff0c;所以我们可以用HashMap<Character, ArrayList<…...

    在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后,在虚拟机中未能看到共享的内容

    在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后&#xff0c;如果在虚拟机中未能看到共享的内容&#xff0c;可能是由于以下原因&#xff1a; VMware Tools 未正确安装&#xff1a;共享文件夹功能依赖于 VMware Tools 或 Open VM Tools。如果未安装或安装不完整&#xff0…...

    台式电脑插入耳机没有声音或麦克风不管用

    目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…...

    Windchill开发-WTContainer相关API整理

    Windchill开发-WTContainer相关API整理 概述各容器对象相关方法站点容器组织容器产品容器/存储库容器上下文团队角色组 文件夹 方法汇总 概述 Windchill 的环境由一组容器组成&#xff0c;容器分为三级&#xff1a;第一级为站点容器&#xff0c;第二级为组织容器&#xff0c;第…...

    理解JSON-RPC 2.0 协议

    JSON-RPC 2.0是指一种基于 JSON 的远程过程调用协议&#xff0c;用于在网络上进行跨平台和跨语言的通信。它提供了一种简单、轻量级的方式来实现客户端和服务器之间的方法调用和数据交换。在原文中&#xff0c;JSON-RPC 2.0被用来描述 STDIO 传输机制中消息的格式&#xff0c;即…...

    【 C# 使用 MiniExcel 库的典型场景】

    以下是 C# 使用 MiniExcel 库的典型场景及代码示例&#xff1a; 一、基础读取操作 强类型读取‌&#xff08;需定义数据模型类&#xff09; 定义与 Excel 列名匹配的类后直接映射为对象集合&#xff1a; csharp Copy Code public class UserAccount { public int Id { get; …...

    创建 Pod 失败,运行时报错 no space left on device?

    遇到创建Pod失败并报错“no space left on device”时&#xff0c;请按照以下步骤排查和解决问题&#xff1a; 1. 定位问题来源 查看Pod事件&#xff1a; kubectl describe pod <pod-name> -n <namespace> 在输出中查找 Events 部分&#xff0c;确认错误是否与…...

    [leetcode]查询区间内的所有素数

    一.暴力求解 #include<iostream> #include<vector> using namespace std; vector<int> result; bool isPrime(int i) { if (i < 2) return false; for (int j 2;j * j < i;j) { if (i % j 0) { …...

    【Web安全】如何在 CDN 干扰下精准检测 SSRF?Nuclei + Interactsh 实战

    ❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 背景 在日常漏洞复核中&#xff0c;我们常用 DNSLog 平台判断目标是否存在 SSRF 漏洞&#xff1a;只要请…...

    输入框只能输入非中文字符

    在 Qt 中&#xff0c;可以通过设置输入法过滤器&#xff08;QInputContext&#xff09;或使用正则表达式来限制输入框&#xff08;QLineEdit 或 QTextEdit&#xff09;只能输入非中文字符。以下是两种实现方法&#xff1a; ### 方法 1&#xff1a;使用正则表达式 可以通过 QLi…...

    LeeCode 136. 只出现一次的数字

    给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1…...

    Traefik应用:配置容器多个网络时无法访问问题

    Traefik应用&#xff1a;配置容器多个网络时无法访问问题 介绍解决方法问题原因&#xff1a; **容器多网络归属导致 Traefik 无法正确发现路由规则**。解决方案方法 1&#xff1a;将应用容器 **仅连接** 到 traefik-public 网络方法 2&#xff1a;显式指定 Traefik 监听的网络 …...

    超便捷超实用的文档处理工具,PDF排序,功能强大,应用广泛,无需下载,在线使用,简单易用快捷!

    小白工具https://www.xiaobaitool.net/files/pdf-sort/ 中的 PDF 排序功能是一项便捷实用的文档处理服务&#xff0c;以下是其具体介绍&#xff1a; 操作便捷直观&#xff1a;用户上传 PDF 文件后&#xff0c;可通过直接拖动页面缩略图来调整顺序&#xff0c;就像在纸质文档中…...

    zsh: command not found - 鸿蒙 HarmonyOS Next

    终端中执行 hdc 命令抛出如下错误; zsh: command not found 解决办法 首先,查找到 DevEco-Studio 的 toolchains 目录路径; 其次,按照类似如下的文件夹层级结果推理到 toolchains 子级路径下,其中 sdk 后一级的路径可能会存在差异,以实际本地路径结构为主,直至找到 openharm…...

    【动态规划】 深入动态规划—两个数组的dp问题

    文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开&#xff0c;旨在通过对这两个数组元素间关系的分析&#xff0c;找出…...

    金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类

    一、网络数据采集 证券宝是一个免费、开源的证券数据平台&#xff08;无需注册&#xff09;&#xff0c;提供大盘准确、完整的证券历史行情数据、上市公司财务数据等&#xff0c;通过python API获取证券数据信息。 1. 安装并导入第三方依赖库 baostock 在命令提示符中运行&…...

    指定运行级别

    linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程&#xff1a; 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…...

    7.第二阶段x64游戏实战-string类

    免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;7.第二阶段x64游戏实战-分析人物属性 string类是字符串类&#xff0c;在计算机中…...

    【MySQL基础】左右连接实战:掌握数据关联的完整视图

    1 左右连接基础概念 左连接(left join)和右连接(right join)是MySQL中两种重要的表连接方式&#xff0c;它们与内连接不同&#xff0c;能够保留不匹配的记录&#xff0c;为我们提供更完整的数据视图。 核心区别&#xff1a; left join&#xff1a;保留左表所有记录&#xff0c;…...

    建筑工程行业如何选OA系统?4大主流产品分析

    工程行业项目的复杂性与业务流程的繁琐性对办公效率提出了极高要求。而OA 系统&#xff08;办公自动化系统&#xff09;的出现&#xff0c;为工程企业提供了一种全新的、高效的管理模式。 工程行业OA系统选型关键指标 功能深度&#xff1a;项目管理模块完整度、文档版本控制能…...

    动态科技感html导航网站源码

    源码介绍 动态科技感html导航网站源码&#xff0c;这个设计完美呈现了科幻电影中的未来科技界面效果&#xff0c;适合展示技术类项目或作为个人作品集的入口页面&#xff0c;自适应手机。 修改卡片中的链接指向你实际的HTML文件可以根据需要调整卡片内容、图标和颜色要添加更…...

    CLIPGaze: Zero-Shot Goal-Directed ScanpathPrediction Using CLIP

    摘要 目标导向的扫描路径预测旨在预测人们在搜索视觉场景中的目标时的视线移动路径。大多数现有的目标导向扫描路径预测方法在面对训练过程中未出现的目标类别时,泛化能力较差。此外,它们通常采用不同的预训练模型分别提取目标提示和图像的特征,导致两者之间存在较大的特征…...

    wsl-docker环境下启动ES报错vm.max_map_count [65530] is too low

    问题描述 在windows环境下用Docker Desktop&#xff08;wsl docker&#xff09;启动 elasticsearch时报错 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决方案 方案一 默认的vm.max_map_count值是65530,而es需要至少262…...

    js chrome 插件,下载微博视频

    起因&#xff0c; 目的: 最初是想下载微博上的NBA视频&#xff0c;因为在看网页上看视频很不方便&#xff0c;快进一次是10秒&#xff0c;而本地 VLC 播放器&#xff0c;快进一次是5秒。另外我还想做点视频剪辑。 对比 原来手动下载的话&#xff0c;右键检查&#xff0c;复制…...

    游戏引擎学习第212天

    "我们将同步…"α 之前我们有一些内容是暂时搁置的&#xff0c;因为在调整代码的过程中&#xff0c;我们做了一些变动以使代码更加简洁&#xff0c;这样可以把数据放入调试缓冲区并显示出来&#xff0c;这一切现在看起来已经好多了。尽管现在看起来更好&#xff0c;…...

    PXE远程安装服务器

    目录 搭建PXE远程安装服务器 1、准备Linux安装源&#xff1a; 2、安装并启用TFTP服务&#xff1a; 3、准备Linux内核、初始化镜像文件 4、准备PXE引导程序 5、安装并启用DHCP服务 6、&#xff08;1&#xff09;配置启动菜单文件(有人应答) ‌6、&#xff08;2&#xff09…...

    软件测试之功能测试详解

    一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。 督促和协助开发人员尽快地解决程序中的缺陷。 帮助项目管理人员制定合理的开发和测试计划。 对缺陷进行…...

    Python深度学习基础——卷积神经网络(CNN)(PyTorch)

    CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08;Pooling&#xff09;。DNN 的全连接…...

    pytorch 反向传播

    文章目录 概念计算图自动求导的两种模式 自动求导-代码标量的反向传播非标量变量的反向传播将某些计算移动到计算图之外 概念 核心&#xff1a;链式法则 深度学习框架通过自动计算导数(自动微分)来加快求导。 实践中&#xff0c;根据涉及号的模型&#xff0c;系统会构建一个计…...

    VSCode解决中文乱码方法

    目录 一、底层原因 二、解决方法原理 三、解决方式&#xff1a; 1.预设更改cmd临时编码法 2.安装插件法&#xff1a; 一、底层原因 当在VSCode中遇到中文显示乱码的问题时&#xff0c;这通常是由于文件编码与VSCode的默认或设置编码不匹配&#xff0c;或…...

    pandas.DataFrame.dtypes--查看和验证 DataFrame 列的数据类型!

    查看每列的数据类型&#xff0c;方便分析是否需要数据类型转换 property DataFrame.dtypes[source] Return the dtypes in the DataFrame. This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. Columns with…...

    高性能服务开发利器:redis+lua

    Redis 与 Lua 脚本的结合&#xff0c;其核心价值在于 ​原子性操作​ 和 ​减少网络开销。 一、Redis 执行 Lua 脚本的优势​ ​原子性​ Lua 脚本在 Redis 中原子执行&#xff0c;避免多命令竞态条件。 ​减少网络开销​ 将多个 Redis 命令合并为一个脚本&#xff0c;减少客…...