shell脚本学习笔记2

2023-11-16

小试牛刀(Ⅱ)

1.7 别名

当我们执行一些较长的命令时,重复的输入会非常麻烦,这时我们可以为这类命令创建一个简短的别名,创建别名使用 alias 命令。

# 创建别名
alias new_command='command sequence' 

alias install='sudo apt-get install' 

# 删除原始文件,同时在backup目录中保留副本。
alias rm='cp $@ ~/backup && rm $@' 

# 列出当前定义的所有别名
alias
  • alias 命令的效果只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。为了使别名在所有的shell中都可用,可以将其定义放入~/.bashrc文件中。每当一个新的交互式shell进程生成时,都会执行 ~/.bashrc中的命令。

    echo 'alias cmd="command seq"' >> ~/.bashrc

  • 如果需要删除别名,只需将其对应的定义(如果有的话)从~/.bashrc中删除,或者使用unalias 命令。也可以使用 alias example= ,这会取消别名 example

    unalias example 或者 alias example=

  • 创建别名时,如果已经有同名的别名存在,那么原有的别名设置将被新的设置取代。

1.8 获取并设置日期及延时

延时可以用来在程序执行过程中等待一段时间(比如1秒),或是每隔几秒钟(或是几个月)监督某项任务。日期能够以多种格式呈现。在系统内部,日期被存储成一个整数,其取值为自1970年1月1
日0时0分0秒起所流逝的秒数。这种计时方式称为纪元时或Unix时间。 下边是一些常见的使用方式:

# 打印日期
date     # Fri 19 Aug 2022 04:04:08 AM UTC

# 打印纪元时
date +%s    # 1660882402

# 将日期转换为纪元时
date --date "Wed mar 15 08:09:16 EDT 2017" +%s     # 1489579718

# 打印某天属于星期几
date --date "Jan 20 2001" +%A     # Saturday 
date +%A

# 设置系统日期
date -s "21 June 2009 11:01:22" 

上述例子中,通过使用带前缀 + 的字符串,可以指定所需要打印的日期信息,类似的字符串还有如下:

日期内容 格式
工作日(weekday) %a(例如:Sat)
%A(例如:Saturday)
%b(例如:Nov)
%B(例如:November)
%d(例如:31)
特定格式日期(mm/dd/yy) %D(例如:10/18/10)
%y(例如:10)
%Y(例如:2010)
小时 %I或%H(例如:08)
分钟 %M(例如:33)
%S(例如:10)
纳秒 %N(例如:695208515)
Unix纪元时 %s(例如:1290049486)

对一段代码进行计时:

#!/bin/bash 
#文件名: time_take.sh 
start=$(date +%s) 
commands; 
statements; 
end=$(date +%s) 
difference=$(( end - start)) 
echo Time taken to execute commands is $difference seconds. 

1.9 调试脚本

所有编程语言都应该实现的一个特性就是在出现始料未及的情况时,能够生成跟踪信息。调试信息可以帮你弄清楚是什么原因使得程序行为异常。

Bash 的调试主要有以下三种调试方式:

一、使用 Bash 内建的调试工具:

  • 使用 -x 选项运行脚本:bash -x script.sh,会打印出每行命令以及当前的状态。

  • 使用 set -xset +x 可以对脚本的部分内容进行调试。

#!/bin/bash 
#文件名: debug.sh 
for i in {1..6}; 
do 
    set -x 
    echo $i 
    set +x 
done 
echo "Script executed" 

-x+x 之间的区域进行调试

二、通过 _DEBUG 环境变量生成调试信息

#!/bin/bash 
function DEBUG() 
{ 
    [ "$_DEBUG" == "on" ] && $@ || : 
} 
for i in {1..10} 
do 
  DEBUG echo "I is $i" 
done 

_DEBUG=on ./script.sh ,设置 _DEBUG=on 来运行

三、使用 shebang 进行调试

把 shebang 从 #!/bin/bash 改成 #!/bin/bash -xv,这样一来,不用任何其他选项就可以启用调试功能了。

sh -x testScript.sh 2> debugout.txt 可以将调试的信息输出到指定的文件。

1.10 函数和参数

函数的定义包括function命令、函数名、开/闭括号以及包含在一对花括号中的函数体。

# 函数的定义
function fname()
{
	statements;
}

fname()
{
	statements;
}

# 函数的调用,直接使用函数名调用即可
fname;

# 函数参数可以按位置访问, $1 是第一个参数, $2 是第二个参数,
fname arg1 arg2;
fname() 
{ 
    echo $1, $2;    #访问参数1和参数2 
    echo "$@";      #以列表的方式一次性打印所有参数 
    echo "$*";      #类似于$@,但是所有参数被视为单个实体 
    return 0;       #返回值 
} 
  • 与其它语言不同的是,bash 的函数不需要形式参数,而是通过以下特定的方式访问。

    $0 是脚本名称。
    $1 是第一个参数。
    $2 是第二个参数。
    $n 是第n个参数。
    “$@” 被扩展成 “$1” “$2” “$3” 等。
    “$*” 被扩展成 “$1c$2c$3” ,其中 c 是IFS的第一个字符。

1.11 将一个命令的输出发送给另一个命令

Unix shell脚本最棒的特性之一就是可以轻松地将多个命令组合起来生成输出。一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递至下一个命令,以此类推。

命令输入通常来自于 stdin 或参数。输出可以发送给 stdout 或 stderr 。当我们组合多个命令时,通常将 stdin 用于输入, stdout 用于输出。

在这种情况下,这些命令被称为过滤器(filter)。我们使用管道(pipe)连接每个过滤器,管道操作符是 | 。例如:comd1 | comd2 | comd3

我们通常使用管道并配合子shell的方式来组合多个命令的输出。

# 1. 组合两个命令
ls | cat -n > out.txt 

# 2. 子 shell 法
cmd_output=$(ls | cat -n) 
echo $cmd_output 

# 3. 反引用
cmd_output=`ls | cat -n`
echo $cmd_output 
  1. ls (列出当前目录内容)的输出被传给 cat -n ,后者为通过 stdin 所接收到的输入内容加上行号,然后将输出重定向到文件out.txt。
  2. 将命令的输出赋值给变量,之后以命令行参数的形式传递给下一跳命令
  3. 类似子 shell 法,也是先将命令的输出先赋值给变量

1.11.1 利用子 shell 生成一个独立的进程

子shell本身就是独立的进程。可以使用 () 操作符来定义一个子shell。

pwd
(cd /bin; ls)

当命令在子shell中执行时,不会对当前shell造成任何影响;所有的改变仅限于该子shell内。例如,当用 cd 命令改变子shell的当前目录时,这种变化不会反映到主shell环境中。

1.11.2 通过引用子shell的方式保留空格和换行符

假设我们使用子shell或反引用的方法将命令的输出保存到变量中,为了保留输出的空格和换行符( \n ),必须使用双引号。

$ cat text.txt 
1 
2 
3 
 
$ out=$(cat text.txt) 
$ echo $out 
1 2 3     # 丢失了1、2、3中的\n  
 
$ out="$(cat text.txt)" 
$ echo $out 
1 
2 
3 

1.12 在不按下回车键的情况下读入 n 个字符

Bash命令 read 能够从键盘或标准输入中读取文本。

# 从输入中读取n个字符并存入变量 var
read -n 2 var

# 用无回显的方式读取密码: 
read -s var

# 显示提示信息
read -p "Enter input:" var 

# 给定的时间内输入,单位是 秒
read -t 2 var

# 用特定的定界符作为输入行的结束: 
read -d ":" var 

1.13 持续运行命令直到执行成功

有时候命令只有在满足某些条件时才能够成功执行。例如,在下载文件之前必须先创建该文件。这种情况下,你可能希望重复执行命令,直到成功为止。

首先我们可以定义如下形式的函数:

repeat() 
{ 
  while true 
  do 
    $@ && return 
  done 
}

调用该函数会重复执行 while 循环,直到命令执行成功,才返回。

为了方便可以将该函数放入shell的rc文件,更便于使用。

repeat() { while true; do $@ && return; done }

但上述函数的一个缺点是每执行一次 while 循环都会生成一个新的进程,因为在 shell 中 true 是通过 /bin 目录下一个二进制文件实现的。

为了避免这种情况,可以使用shell的内建命令 : ,该命令的退出状态总是为0:

repeat() { while :; do $@ && return; done }

如果我们事先知道某条命令的执行需要耗费一定的时间,比如执行下载某个文件命令,那么直接执行上述命令会造成的一个结果是会产生大量对目标服务器的下载请求。有可能会被目标服务器拉黑,因此我们可以在上述函数中加入一段时延,

repeat() { while :; do $@ && return; sleep 30; done }

没 30s 执行一次

1.13.1 内建命令和外部命令

shell 中的命令分为内建命令和外部命令。前者是构建在shell内部;后者是一个独立的文件(可以是二进制文件,也可以是一个脚本)

**内部命令:**实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bash源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。

外部命令:它的执行比较复杂,shell进程会fork一个子进程,父进程随后挂起,然后在子进程中exec加载外部文件,子进程返回后,父进程才继续执行。

判断方式:我们可以使用 type命令判断某个命令是否是内建命令

type cd # cd is a shell builtin
type ifconfig # ifconfig is /usr/sbin/ifconfig

1.13.2 shell 中的条件判断

在 shell 中每一条命令或者表达式执行完之后都会返回一个状态码,在条件判断的时候会根据该状态码进行判断,0 被认为为真,1 被认为为假。可以通过$?获取最近执行命令或表达式的状态码

true
$? # 0

false
$? # 1

[ 1 == 1 ]
$? # 0

[ 1 == 2 ]
$? # 1

1.14 字段分隔符与迭代器

1.14.1 字段分隔符

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念。作为分隔符,IFS有其特殊用途。它是一个环境变量,其中保存了用于分隔的字符。它是当前shell环境使用的默认定界字符串。默认情况下,系统的 IFS 默认为空白字符(换行符、制表符或者空格)

#!/bin/bash

# IFS 设置为逗号
data="name, gender,rollno,location"
oldIFS=$IFS 
IFS=","     #IFS现在被设置为, 
for item in $data; 
do 
    echo Item: $item 
done 
 
IFS=$oldIFS 

# Item: name
# Item:  gender
# Item: rollno
# Item: location

# -------------------------

# IFS 为默认值
data="name, gender,rollno,location"
oldIFS=$IFS 
for item in $data; 
do 
    echo Item: $item 
done 
 
IFS=$oldIFS 
# Item: name,
# Item: gender,rollno,location

1.14.2 迭代器

for 循环

#!/bin/bash

for var in {a..z}; do
   echo ${var}
done

for ((i=0;i<10;++i)); do
   echo ${i}
done

**注意:**运行的时候需要使用 bash xxx.sh,sh xxx.sh 不可以,不支持 {…} 扩展。

sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。

bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

while 循环

#!/bin/bash

i=0
while(( ${i}<10 ))
do
   echo ${i}
   let "i++"
done

until 循环

x=0; 
until [ $x -eq 9 ];    #条件是[$x -eq 9 ] 
do 
    let x++; echo $x; 
done 

当条件不为真时就一直循环,直到条件为真时截止

1.15 比较和测试

if

if condition; 
then 
    commands; 
fi

if condition;  
then 
    commands; 
else if condition; then 
    commands; 
else 
    commands; 
fi 

算术比较

[ $var -eq 0 ] #当$var等于0时,返回真 [ $var -ne 0 ] #当$var不为0时,返回真

需要注意,在 [ 或 ] 与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错。

-gt :大于

-lt :小于

-ge :大于或等于。

-le :小于或等于。

-a :逻辑与

-o :逻辑或

!:逻辑非

文件系统相关

[ -f $file_var ] :如果给定的变量包含正常的文件路径或文件名,则返回真
[ -x $var ] :如果给定的变量包含的文件可执行,则返回真
[ -d $var ] :如果给定的变量包含的是目录,则返回真
[ -e $var ] :如果给定的变量包含的文件存在,则返回真
[ -c $var ] :如果给定的变量包含的是一个字符设备文件的路径,则返回真
[ -b $var ] :如果给定的变量包含的是一个块设备文件的路径,则返回真
[ -w $var ] :如果给定的变量包含的文件可写,则返回真
[ -r $var ] :如果给定的变量包含的文件可读,则返回真
[ -L $var ] :如果给定的变量包含的是一个符号链接,则返回真

字符串比较

进行字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。

注意,双中括号是Bash的一个扩展特性。如果出于性能考虑,使用ash或dash来运行脚本,那么将无法使用该特性。

# 测试两个字符串是否相等
[[ $str1 = $str2 ]]
[[ $str1 == $str2 ]]
[[ $str1 != $str2 ]]

# 按字典序比较
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]

# 判断是否为空串
[[ -z $str1 ]]

# 判断是否为非空串
[[ -n $str1 ]]
  • 等于号前后需要加上空格,不然会变成赋值操作

上述括号可以使用 test 命令进行替代,避免过多使用 [],增加代码的可读性。

if  test $var -eq 0 ; then echo "True"; fi 

test 是一个外部程序,需要衍生出对应的进程,而 [ 是Bash的一个内部函数,因此后者的执行效率更高。 test 兼容于Bourne shell、ash、dash等。
的一个扩展特性。如果出于性能考虑,使用ash或dash来运行脚本,那么将无法使用该特性。

# 测试两个字符串是否相等
[[ $str1 = $str2 ]]
[[ $str1 == $str2 ]]
[[ $str1 != $str2 ]]

# 按字典序比较
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]

# 判断是否为空串
[[ -z $str1 ]]

# 判断是否为非空串
[[ -n $str1 ]]
  • 等于号前后需要加上空格,不然会变成赋值操作

上述括号可以使用 test 命令进行替代,避免过多使用 [],增加代码的可读性。

if  test $var -eq 0 ; then echo "True"; fi 

test 是一个外部程序,需要衍生出对应的进程,而 [ 是Bash的一个内部函数,因此后者的执行效率更高。 test 兼容于Bourne shell、ash、dash等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本学习笔记2 的相关文章

  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • Python bash 管道

    我想将 python 脚本的输出通过管道传输到 bash 脚本 到目前为止我所做的是尝试使用os popen sys subprocess 并试图给出一个管道的例子 os popen echo P 1 1 591336 4927369 1
  • 忽略 sed 查找和替换命令中的斜杠

    我正在尝试在终端中使用 sed 进行查找和替换 在 apache 配置文件中 我尝试替换 DocumentRoot var www with DocumentRoot var www mysite com public html 从命令行
  • 使用 grep 查找所有匹配的模式

    In txt1 S01A1P2 S01A1P5 S01A1P4 In txt2 data train wave S01A1P3 mfc data train wave S01A1P7 mfc data train wave S01A1P8
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • Bash 字符串之间的比较 - 相等但不相等

    我只想在 Bash 中的两个字符串之间进行非常简单的比较 stat curl Is url head n 1 echo stat if stat HTTP 1 1 200 OK then echo symbol is OK echo sta
  • wget 并行下载文件并重命名

    我有一个包含两列的文本文件 第一列是要保存的名称 第二列是资源的 url 地址 10000899567110806314 jpg http lifestyle inquirer net files 2018 07 t0724cheekee
  • Bash touch - 非法选项 -d

    昨天我拍了很多照片 但我忘记更改相机中的时区 现在所有图片的修改日期都有错误 我想将特定目录中所有文件的修改日期更改为minus 10 hours bin sh for i in Users slick Desktop 100D5200 d
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • BASH 中的空函数

    我正在使用 FPM 工具创建 deb 包 此工具在从支持的文件中删除包之前 之后创建 不幸的是FPM生成的bash脚本包含这样的函数 dummy 该脚本退出时出现错误 语法错误 意外 BASH 不允许空函数吗 哪个版本的 bash linu
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 获取 Bash 中最后运行的程序的名称

    我有一个 bash 脚本 我使用 trap 命令捕获错误 并且我希望能够打印最后一个命令的名称 失败的命令 bin bash function error echo program name trap error ERR Some comm
  • Bash 的源命令无法处理从互联网上卷曲的文件

    我正在尝试使用curl从互联网获取脚本文件 如下所示 source lt curl url echo done 我看到的是 完成 得到了回响before卷曲甚至开始下载文件 这是实际的命令和输出 bash 3 2 source lt cur
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na

随机推荐

  • 和数集团聚焦区块链人才培养推动数字经济场景落地

    随着互联网时代的不断推进 全球经济结构已呈现多元化形态 尤其是大数据 云计算 人工智能等技术革新进步 数字经济迎来了快速发展的时期 从更深层次方面理解 数字经济也契合创新 协调 绿色 开放 共享的新发展理念 为我们国家经济社会发展注入了新动
  • Hive(八)Hive的Shell操作与压缩存储

    一 Hive的命令行 1 Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell set key value Use this
  • node.js如何封装一个接口

    用到的应用 1 webstorm 2 Navicat for MySQL 3 postman 一 使用express创建项目 1 npm install express generator g 2 express myapp 二 使用Nav
  • Openwrt下ipk包的安装、卸载与更新

    一 环境说明 Openwrt version 17 01 4 Linux version 4 4 92 二 安装ipk 将编译好的 ipk传到开发板上 使用命令 opkg install xxxxx ipk 安装成功的界面如下 再进入 li
  • 【软件工程期末复习内容】

    前言 时不可以苟遇 道不可以虚行 一 软件工程的概念 软件是计算机系统运行的 指令 数据 和 相关文档 的集合 即软件等于程序 数据 加上文档 程序 是事先按照预定功能性能等要求设计和编写的指令序列 数据 是使程序正常处理信息的数据结构及信
  • 远程计算机内部错误,Win10系统远程桌面连接出现内部错误怎么办?

    Win10系统远程桌面连接出现内部错误该怎么办 大家在使用Win10系统的时候总是会出现这样那样的问题 Win 10 远程桌面连接偶尔提示 出现了内部错误 刚刚明明还好好的 有时连接久了会突然断开 提示出现了内部错误 我们遇到这个问题该怎么
  • 生态系统过程模型

    生态系统过程模型 根据生态系统的生理生态学特性 结合影响生态系统过程的观测指标 提出的能够反映生态系统过程的机制模型 统计模型 stochasticmodel statisticmodel probabilitymodel 指以概率论为基础
  • qt 动态库的创建和使用教程(step by step)

    一般大型项目中 会将实现特定功能的函数或类 封装成链接库 供应用程序代码调用 下面我将一步步教你如何在qt 中创建动态库 并使用它 目录 创建多子目录项目 创建动态链接库 编辑链接库内容 创建应用工程并连接动态链接库 创建多子目录项目 首先
  • React基础入门

    系统学习React 一 基础知识 邂逅React开发 React系列一 核心JSX语法一 React系列二 核心JSX语法二 React系列三 阶段案例练习 React系列四 React脚手架 React系列五 组件化开发 一 React系
  • mysql8.0.30用户与权限管理

    文章目录 用户管理 登录mysql服务器 创建用户 修改用户 删除用户 查看用户 修改用户密码 权限管理 查看权限 授予权限的原则 授予权限 查看权限 收回权限 查看user 信息表结构和信息 db表 其他表信息 角色管理 创建角色 给角色
  • Python之NumPy(axis=0/1/2...)的透彻理解

    前言 在numpy的使用中 对axis的使用总是会产生疑问 如np sum函数 在多维情况下 axis不同的取值应该做怎样的运算呢 返回的是什么形状的数组呢 在网上查了很多资料 总是似懂非懂 查阅了官方文件 以及多次试验后 我总结出一种能深
  • [ZYNQ随笔] uboot移植中bitstream比特流加载问题:zynq_validate_bitstream: Bitstream is not validated yet

    问题介绍 由于项目设计需要 需要频繁的更换比特流文件 之前使用petalinux生成的boot bin每次都需要合并比特流 比较麻烦 遂换了一个uboot版本 米联客默认的u boot 将bitstream放到了独立于boot bin的文件
  • 经验教训

    最近有一个项目基于STM32F446ZE MCU使用FREERTOS操作系统开发 之前有部分功能代码是基于MCU裸机开发的 移植过程种发现程序老出错 DEBUG模式条件发现程序停在了HardFault Handler中断服务程序中 查看对应
  • 对角矩阵np.diag()

    np diag 是 NumPy 库中的一个函数 用于创建一个对角矩阵或从一个矩阵中提取对角线元素 具体来说 np diag 可以接受以下两种参数 一个一维数组 将其转换为一个对角矩阵 数组中的元素将成为对角线上的元素 例如 np diag
  • STM3232 GPIO的配置寄存器(为了移植IIC)

    参考 https blog csdn net qq 45539458 article details 129481019 https blog csdn net weixin 43314829 article details 1255734
  • 公共IP地址、私有IP地址、NAT技术

    1 公共IP地址和私有IP地址的区别 在 Internet 上存在数量有限的 IP 地址 这些能在Intenet上使用的地址被称为公共IP地址 且IP地址必须是唯一的 但是私有IP地址就是例外 这些IP地址供LAN网络中使用 同时它们可以在
  • Win7连接共享打印机时,报 0x00000bcb 错误

    打印服务器添了台 DocuCentre VI C3371 富士施乐3371打印机 问题描述 Win8 1 Win10等系统均能正常连接 部分 Win7 客户端连接时 报0x00000bcb错误 解决方法 后来桌面小哥找到了解决方法 Win7
  • 带头节点链表的操作使用讲解

    带头结点链表 链表一共具有创建 增添 删除 查找四种基本操作 接下来会对这四种操作进行挨个讲解 在此之前首先提供链表结点 初始化链表 删除链表的代码 链表结点 每一个节点都包含有一个数据以及指向下一结点的指针 以及定义一个链表的头指针 ty
  • 【Java八股文总结】之面试题(二)

    文章目录 面试题 一 几种锁的区别 1 synchronized 和ReentrantLock的区别 二 Java高级 1 反射 1 反射的应用场合 2 Java反射API 3 反射使用步骤 获取Class 对象 调用对象方法 4 获取Cl
  • shell脚本学习笔记2

    小试牛刀 文章目录 小试牛刀 1 7 别名 1 8 获取并设置日期及延时 1 9 调试脚本 1 10 函数和参数 1 11 将一个命令的输出发送给另一个命令 1 11 1 利用子 shell 生成一个独立的进程 1 11 2 通过引用子sh