操作系统强化认识之Shell编程学习与总结
目录
1.Shell的概述
2.Shell脚本入门
3.变量
3.1.系统预定义变量
3.2.自定义变量
3.3.特殊变量
4.运算符
5.条件判断
6.流程控制
6.1.if判断
6.2.case语句
6.3.for循环
6.4.while循环
7.read读取控制台输入
8.函数
8.1.系统函数
8.2.自定义函数
9.正则表示式入门
10.文本处理工具
10.1.cut
10.2.awk
11.综合应用案例
11.1.归档文件
11.2.发送消息
1.Shell的概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。
Linux的shell有多种,常见的有:
-
Bash:Bash是Linux默认的Shell,也是最常见的Shell之一。
-
Zsh:Zsh是一个功能强大的Shell,拥有很多特性,可以自动补全命令、支持主题、插件等。
-
Ksh:Ksh是Unix系统默认的Shell,是一种比较流行的Shell。
-
Dash:Dash是一种轻量级的Shell,可以在需要快速启动Shell时使用。
-
Perl:Perl是一种脚本语言,也可以作为Shell使用。
Shell脚本是一个包含一些列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列得到执行。Shell可以将命令组合起来,形成一个复合命令,可以简化操作。
2.Shell脚本入门
1.脚本格式:
脚本以#!/bin/bash
开头(指定解释器)
2.第一个Shell脚本:helloworld.sh:
-
需求:创建一个Shell脚本,输出helloworld
-
案例实操
首先创建脚本:
touch helloworld.sh vim helloworld.sh
在写入内容:
#!/bin/bash echo "hello world"
-
脚本的常用执行方式
第一种:采用bash或者sh+脚本的相对路径或者绝对路径(不用赋予脚本+x权限)
sh+脚本的相对路径
sh ./helloworld.sh
sh+脚本的绝对路径
sh /home/atguigu/shells/helloworld.sh
bash+脚本的相对路径
bash ./helloworld.sh
bash+脚本的绝对路径
bash /home/atguigu/shells/helloworld.sh
第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
-
首先要赋予helloworld.sh脚本+x权限
chmod +x helloworld.sh
-
执行脚本
相对路径
./helloworld.sh
绝对路径
/home/atguigu/shells/helloworld.sh
第三种:在脚本路径前面加上"."或者source
cat test.sh
#!/bin/bash
A=5
echo $A
bash test.sh
echo $A
. test.sh
echo $A
source test.sh
我们可以查看source是用来干什么的:
type source
前两种方式都是在当前shell中打开的一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
第三种也就是在使用脚本路径前加上"."或者source的方式,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次要修改完/ettc/profile文件以后,需要source一下的原因。
开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
3.变量
3.1.系统预定义变量
1)常用系统变量
$HOME
$PWD
$SHELL
$USER
2)实例操作
查看系统变量的值和显示当前shell中所有变量set
echo $HOME
set
BASH=/bin/bash
BASH_ALLASES=()
BASH_ARGC=()
BASH_ARGV=()
3.2.自定义变量
1)基础语法
定义变量:变量名=变量值,注意,=号前后不能有空格
撤销变量:unset 变量名
声明静态变量:readonly 变量,注意:不能unset
2)变量定义规则
变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或者单引号括起来。
3)案例实操
a=2 echo $a b=$(1+5) # $()就会计算 unset a # 撤销a变量 readonly b=5 # 变为只读变量,无法修改b的值
注意不要在等号前后写入空格的形式。
子shell里的变量退出exit之后,对于父shell是没有任何影响和改变的。
echo $PATH
如果将我们的代码文件放置在PATH路径下,那么就可以直接运行helloworld.sh文件,无需在前面添加bash、"."路径等操作了。
# vim内 #!/bin/bash echo "hello world" echo "hello,$1" #$1作为一个变量 ./hello.sh ./hello.sh xiaoming # 就会输出变量
3.3.特殊变量
1.$n
基本语法:$n
n为数字
$0代表该脚本名称
$ 1 ~ 9 代表第一个到第九个参数,10以上的参数需要用大括号包含
如${10}
touch parameter.sh
vim parameter.sh
#!/bin/bash
echo '--------$n--------'
echo $0
echo $1
echo $2
chomd 777 parameter.sh
./parameter.sh cls xz
--------$n--------
./parameter.sh
cls
xz
2.$#
获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
touch parameter.sh
vim parameter.sh
echo '=========$n========='
echo $0
echo $1
echo $2
echo '=========$n========='
echo parameter numbers : $#
chomd 777 parameter.sh
./parameter.sh cls xz
=========$n=========
parameter.sh
cls
xz
echo '=========$n========='
parameter numbers : 2
3.$*
$@
$* 这个变量代表命令行中所有的参数,它把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过它能把所有参数区分对待
vim parameter.sh
echo '=========$n========='
echo $0
echo $1
echo $2
echo '=========$n========='
echo parameter numbers : $#
echo '=========$n========='
echo $@
chomd 777 parameter.sh
./parameter.sh cls xz
=========$n=========
parameter.sh
cls
xz
echo '=========$n========='
parameter numbers : 2
=========$n=========
cls xz
4.$?
最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令行自己来解决),则证明上一个命令行执行不正确了。)
案例操作:
./helloworld.sh echo $? 0
4.运算符
expr表达式
a=1+2
echo $a
1+2
expr 1+2
1+2
expr 1 + 3
4
expr 5 - 2
3
expr 5 * 2 # 会报错
expr: 语法错误
expr 5 \* 2 # 这才是正确的
10
$(运算式)
或者$[运算式]
S=$[(2+3)*4] echo $S 20 a=$(expr 5 \* 2) # 等价替换 echo $a 10 a=`expr 5 \* 4` echo $a 20
实验案例:
touch add.sh vim add.sh # vim下的代码编写 #!/bin/bash sum=$[$1 + $2] echo sum=$sum # 保存退出以后运行 chmod +x add.sh ./add.sh 25 89 sum=114
5.条件判断
1.基本语法
-
test condition
-
[condition](注意condition前后要有空格0
注意:条件非空即为true,[atguigu]返回true,[ ]返回false
a=hello echo $a hello test $a = hello echo $? 0 # 证明a和hello是相等的 test $a = Hello echo $? 1 # 说明a和hello是不相等的
[condition]
$a=Hello [$a = Hello] echo $? 0 [$a=hello] echo $? 0 # 这说明没有空格就会导致值被替换 [$a = Hello] echo $? 1 [$a = hello] echo $? 0 [$a != hello]
2.常用判断条件
-
两个整数之间的比较
-eq等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less equal)
-gt大于(greater than)
-ge大于等于(greater equal)
注意:如果是字符串之间的比较,用等号"="判断相等;用"!="判断不相等
[2 -gt 9] echo $? 1
-
按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
touch test [ -r hello.sh] echo $? 0 [ -w hello.sh] echo $? 0 [ -x hello.sh] echo $? 0
-
按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
[ -e /home/tang/desktop/tang.sh ] echo $? 0 [ -f /home/tang/desktop/tang.sh ] echo $? 0 [ -d /home/tang/desktop/tang.sh ] echo $? 1
-
多逻辑判断
&& 表示前一条命令执行成功时,才执行后一条命令
|| 表示上一条命令执行失败后,才执行下一条命令
a=15 [ $a -lt 20 ] && echo "&a < 20" || echo "$a >= 20" &a < 20
6.流程控制
6.1.if判断
单分支:
if [ 条件判断式 ]; then程序 fi
或者
if [ 条件判断式 ] then程序 fi
实验:
a=25 if [ $a -gt 10 ]; then echo Ok
多分支:
if [ 条件判断式 ] then程序 elif [ 条件判断式 ] then程序 else then程序 fi
实验:
vim if_test.sh
#!/bin/bash
if [ $1 = atguigu ]
thenecho "welcome, atguigu"
fi
chmod +x if_test.sh
./if_test.sh xiaoming
./if_test.sh atguigu
welcome atguigu
a=15
if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi
echo $a
15
a=25
if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi
OK
a=36
if [ $a -gt 18 ] && [ $a -lt 35]; then echo OK; fi
vim if_test.sh
#!/bin/bash
if [ $1 -lt 18 ]
thenecho "未成年"
elif [ $1 -lt 35 ]
thenecho "成年"
elseecho "老年"
fi
6.2.case语句
case $变量 in "值 1")如果变量值等于值1,则执行程序1 ;; "值 2")如果变量值等于值2,则执行程序2 ;;__省略其他分支__ *)如果变量值都不是以上的值,则执行此程序 ;; esac
注意事项:
-
case行尾必须为单词“in”,每一个模式匹配必须以有括号")"结束
-
双分号";;"表示命令序列结束,相当于java中的break
-
最后的"*)"表示默认模式,相当于java中的default
6.3.for循环
基本语法1:
for ((初始值;循环控制条件;变量变化)) do程序 done
从1加到100
touch for1.sh
vim for1.sh
#!/bin/bash
sum=0
for(( i=0;i<=100;i++))
dosum=$[ $sum + $i ]
done
echo $sum
chmod 777 for1.sh
./for1.sh
5050
基本语法2:
for 变量 in 值1 值2 值3... do程序 done
输出一行:
for os in linux windows macos; do echo $os; done linux windows macos
$*
和$@
表示传递给函数或者脚本的所有参数,不被双引号包含时,都以$1
、$2
....$n
的形式输出所有参数。
touch for3.sh
vim for3.sh
#!/bin/bash
echo '=============$============='
for i in $*
doecho "ban zhang love $i"
done
echo '=============$============='
for j in $@
doecho "ban zhang love $j"
done
chmod 777 for3.sh
./for3.sh cls mly wls
ban zhang love cls
ban zhang love mly
在Shell中,*和∗和@都表示命令行参数(positional parameters)的引用。它们之间的主要区别在于处理参数时的方式。
-
$*:
当使用$*时,它将把所有的命令行参数看作一个整体,并以字符串的形式展开。
可以使用它来迭代所有的参数,但无法单独引用某个参数。
-
$@:
当使用$@时,它将把每个命令行参数都视为独立的字符串,并以数组的形式展开。
可以使用它来单独引用某个参数,或者通过循环来迭代所有的参数。
总结:*将所有命令行参数视为一个整体,而∗将所有命令行参数视为一个整体,而@将每个命令行参数视为独立的字符串。选择使用哪个变量取决于你的需求,如果你需要迭代所有的参数,或者需要单独引用某个参数,那么可以使用相应的变量。
6.4.while循环
while [ 条件判断式 ] do程序 done
1~100的和
touch while.sh
vim while.sh
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
dosum=$[$sum+$i]i=$[$i+1]# 另一种方式# let sum+=i# let i++
done
echo $sum
chmod 777 while.sh
./while.sh
5050
7.read读取控制台输入
read (选项) (参数)
选项:
-
-p:指定读取值的提示符
-
-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待
参数:
变量:指定读取值的变量名
案例实操:
提示7秒内,读取控制台输入的名称
touch read.sh
vim read.sh
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds :" NN
echo $NN
chmod 777 read.sh
./read.sh
Enter your name in 7 seconds :HI
HI
8.函数
8.1.系统函数
basename:
basename [string/pathname][suffix]
功能描述:basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
basename可以理解为取路径里的文件名称
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
案例实操:
截取该/home/tang/desktop/my.txt
basename /home/tang/desktop/my.txt my.txt vim cmd_test.sh #!/bin/bash filename="$1"_log_date$(date +%s)
操作2:
vim parameter.sh
#!/bin/bash
echo '===========$==========='
echo script name: $(basename $0 .sh)
echo script path: $(cd $(dirname $0); pwd)
echo lst parameter: $1
echo 2nd parameter: $2
echo '===========$==========='
echo parameter number: $#
echo '===========$==========='
echo $*
echo '===========$==========='
echo $@
./parameter.sh a b
===========$===========
script name: parameter
script path: /root/scripts
lst parameter: a
2nd parameter: b
===========$===========
parameter number: 2
===========$===========
a b
===========$===========
a b
basename和dirname都是Unix-like操作系统中常用的命令或函数。
basename用于从给定的路径中提取文件名部分。它会将文件路径作为输入,然后返回不包含路径的文件名。如果路径是"/home/user/file.txt",那么basename将返回"file.txt"作为结果。
dirname用于从给定的路径中提取目录部分。它会将文件路径作为输入,然后返回不包含文件名的路径。如果路径是"/home/user/file.txt",那么dirname将返回"/home/user"作为结果。
8.2.自定义函数
[ function ] funname[()] {Action;[return int;] }
经验技巧:
-
必须在调用函数地方之前,先声明函数,shell脚本是逐行运行的,不会像其他语言一样先编译。
-
函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0~255)
案例实操
touch fun_test.sh
vim fun_test.sh
#!/bin/bash
function add()
{s=$[$1 + $2]return $s
}
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
add $a $b
echo "和:"$?
chmod +x fun_test.sh
./fun_test.sh
请输入第一个整数:35
请输入第二个整数:67
和:102
但是上面如果和超过255的话,就不满足相应的答案
所以可以修改:
touch fun_test.sh
vim fun_test.sh
#!/bin/bash
function add()
{s=$[$1 + $2]echo $s
}
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
sum=add $a $b
echo "和:"sum
chmod +x fun_test.sh
./fun_test.sh
请输入第一个整数:156
请输入第二个整数:237
和:393
9.正则表示式入门
正则表达式使用单个字符串来描述、匹配一系列符合某个语言规则的字符串,在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某种模式的文本,在Linux中,grep,sed,awk等文本处理工具都支持通过正则表达式进行模式匹配。
常规匹配:
一串不包含特殊字符的正则表达式匹配它自己
cat /etc/passwd | grep atguigu
就会匹配所有包含atguigu的行
常用特殊字符:
-
特殊字符:
^
^
匹配一行的开头:cat /etc/passwd | grep ^a
会匹配出所有以a开头的行
-
特殊字符:
$
$
匹配一行的结束:cat /etc/passwd | grep t$
会匹配出所有以t结尾的行
-
特殊字符:
.
.
匹配一个任意的字符:cat /etc/passwd | grep r..t
会匹配包含r的所有行
-
特殊字符:
*
*
不单独使用,它和上一个字符连用,表示匹配上一个字符0次或者多次:cat /etc/passed | grep ro*t
会匹配rt,rot,root,rooot等
-
字符区间(中括号):
[]
[]
表示匹配某个范围内的一个字符
[6, 8]匹配6或者8
[0-9]匹配一个0-9的数字
[0-9]*匹配任意长度的数字字符串
[a-z]匹配一个a-z之间的字符
[a-z]*匹配任意长度的字母字符串
[a-c, e-f]匹配a-c或者e-f之间的任意字符
cat /etc/passwd | grep r[a,b,c]*t
会匹配rt,rbt,rabt,rabct等所有行
10.文本处理工具
10.1.cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
基础用法:cut [选型参数] filename
说明:默认分隔符是制表符
选项参数说明:
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符割裂,默认是制表符"\t" |
-c | 按字符进行分割,后加加n表示取第几列 比如-c 1 |
实例操作:
vim cut.txt cat cut.txt dong shen guan zhen wo wo lai lai le le cut -d " " -f 1 cut.txt dong guan wo lai le
10.2.awk
一个强大的文本分析工具。把文件朱行的读入,一空格为默认分隔符每行切割,切开的部分再进行分析处理。
基本用法:awk [选项参数] '/pattern1/{action} /pattern2/{action2}...' filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action在找到匹配内容时所执行的一系列命令
选项参数说明:
选项参数 | 功能 |
---|---|
-F | 指定输入文件分隔符 |
-v | 赋值第一个用户定义变量 |
案例实操:
cat /etc/passwd | awk -F ":" '/^root/ {print $7}'
/bin/bash
cat /etc/passwd | awk -F ":" '/^root/ {print $1","$7'}
root./bin/bash
BEGIN在所有数据读取行之前执行;END在这所有数据执行后执行
将passwd文件中的用户id增加数值1并输出
awk -v i-1 -F : '{print $3+i}' passwd 1 2 3 4 ifconfig | grep -n ^$ 9: 18: 26: ifconfig | awk '/^$ {print NR}' 9 18 26
11.综合应用案例
11.1.归档文件
实际生产应用中,往往需要对重要数据进行归档备份。
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在roo/archive下,
这里用到了归档命令:tar
后面可以加上-c选项表示归档,加上-z选项表示同时进行压缩,得到的文件后缀名为.tar.z。
脚本实现:
vim daily_archive.sh
#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1]
thenecho "参数个数错误!应该输出一个参数,作为归档目录名"exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
thenecho
elseechoecho "目录不存在!"echoexit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
thenechoecho "归档成功!"echo "归档文件为:$DEST"echo
elseecho "归档出现问题!"
chmod u+x daily_archive.sh
mkdir /root/archive
./daily_archive.sh ../scripts
开始归档...
tar: 从成员名中删除开头"/"
归档成功!
归档文件:/root/archive/archive/archive_scripts_220318.tar.gz
crontab -e
0 2 * * * #凌晨2点执行 分钟 小时 天 月 星期
11.2.发送消息
我们可以利用Linux系统自带的mesg和write工具,向其他用户发送消息。
需求:实现一个向某用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的信息。脚本需要检测用户是否登录在系统中,是否打开消息功能,以及当前发送消息是否为空。
who am i root pts/0 2023-08-10 17:00 (192.168.)
脚本实现:
#!/bin/bash
# 查看用户是否登录
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
if [ -z $login_user ]
thenecho "$1 不在线!"echo "脚本退出..."exit
fi
is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $is_allowed != "+" ]
thenecho "$1 没有开启消息功能"echo "脚本退出..."exit
fi
# 确认是否有消息发送
if [ -z $2 ]
thenecho "没有消息发送"
相关文章:

操作系统强化认识之Shell编程学习与总结
目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…...

怎么用conda下载清华源的pytorch(自带cuda的版本)
1,添加镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

【ES6】CommonJS模块和ES6模块
在JavaScript中,模块是一种将功能代码组织成逻辑单元的方式,以便在其他项目中重复使用。有两种主要的模块系统:CommonJS和ES6。 1、CommonJS 在CommonJS中,我们使用require来引入模块,使用module.exports来导出模块。…...

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)
C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行(本文情况)。 线程同步还可以是像十字路口的红绿灯一样,只允许一个方向的车同行,其他方向的车等待。 本…...

Ubuntu18.04更改镜像源(网易,阿里,清华,中科大,浙大)
一,备份原来的源(选做) sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 二,更换源 sudo gedit /etc/apt/sources.list 删除原来内容改为新的镜像源 1,清华源 deb https://mirrors.tuna.tsinghua.edu…...

字节码和机器码的区别
字节码和机器码是计算机程序在不同阶段的表示形式,它们的主要区别如下: 抽象级别不同:字节码是一种中间表示形式,位于源代码和机器码之间。它是一种与特定平台无关的低级表示形式,通常由编译器将源代码转换而来。而机器…...

go学习part21 Redis和Go(2)
1.三方库安装 309_尚硅谷_Go连接到Redis_哔哩哔哩_bilibili 借鉴: Golang 安装 Redis_go fiber 安装redis_柒柒伍贰玖。的博客-CSDN博客 三方redis库已经迁移到以下网址,go get github.com/gomodule/redigo/redis gomodule/redigo: Go client for Red…...

从0到1学会Git(第二部分):Git的本地操作和管理
写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域,分别为工作区,暂存区和本地仓库,我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为,cpu中,…...

hive lateral view 实践记录(Array和Map数据类型)
目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据: create table tmp.test_lateral_view_movie_230829(movie string,category array&…...

理解 std::thread::join
C多线程并发编程入门(目录) 本文用最简单易懂的实际案例,讲清楚了 join 的实际内涵,保证你过目不忘。 Hello join 示例 join 函数是我们接触C多线程 thread 遇到的第一个函数。 比如: int main() {thread t(f);t.…...

C#循环定时上传数据,失败重传解决方案,数据库标识
有些时候我们需要定时的上传一些数据库的数据,在数据不完整的情况下可能上传失败,上传失败后我们需要定时在重新上传失败的数据,该怎么合理的制定解决方案呢?下面一起看一下: 当然本篇文章只是提供一个思路࿰…...

R语言图形的组合( par(),layout(),par(fig()) )
引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据,需要可自取 链接:https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…...

如何为 Flutter 应用程序创建环境变量
我们为什么需要环境变量? 主要用于存储高级机密数据,如果泄露可能会危及您产品的安全性。这些变量本地存储在每个用户的本地系统中,不应该签入存储库。每个用户都有这些变量的副本。 配置 在根项目中创建一个名为 .env 的文件夹(…...

「C++程序设计 (面向对象进阶)」学习笔记・一
0、引言 本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ 😀 有关于现代 C 的基本介绍,请前往《现代C基本介绍》! 🔔 先决条件 本专栏的系列…...

Leetcode125. 验证回文串
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…...

【Yellowbrick】特征可视化分析
Yellowbrick特征可视化分析 ⭐Yellowbrick⭐特征分析可视化⭐Rank1D⭐Rank2D ⭐Yellowbrick Yellowbrick是一个用于可视化机器学习模型和评估性能的Python库。它提供了一系列高级可视化工具,帮助数据科学家和机器学习从业者更好地理解、调试和优化他们的模型。 它在…...

Android大厂需要刷的(999道)面试题
想必大家都在为今年的金九银十做准备,今年也是最为艰难的一年。作为程序员从未感觉到如此艰难,身边不是被辞退就是找不到工作。先不说2023年应届生毕业即失业,作为开发15年的老Android程序员,现在也在和300个人挣一个岗位。 肉少…...

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…...

Java设计模式:四、行为型模式-08:策略模式
文章目录 一、定义:策略模式二、模拟场景:策略模式三、违背方案:策略模式3.0 引入依赖3.1 工程结构3.2 优惠券折扣计算类3.3 单元测试 四、改善代码:策略模式4.1 工程结构4.2 策略模式结构图4.3 优惠券折扣实现4.3.1 定义优惠券接…...

ICCOA蓝牙数字车钥匙2.0
近期,ICCOA智慧车联开放联盟宣布,由小米、vivo、OPPO、长安、深蓝、吉利、极氪、比亚迪、北汽、蔚来、零跑、雪球、瓶钵、融卡等企业联合参与制定的ICCOA蓝牙数字车钥匙2.0标准(简称DK2.0),于2023年9月1日正式发布实施…...

ArcGIS土地利用程度综合指数分析
成图展示: 土地利用程度综合指数 第一步 准备数据 使用的数据为2010年河南省土地利用类型数据与其行政区划县级数据(为了节省操作,这里使用上次实验的部分数据[1],各土地利用类型已被提取) 第二步 面积统计 水域为例…...

服务端请求伪造(SSRF)及漏洞复现
文章目录 渗透测试漏洞原理服务端请求伪造1. SSRF 概述1.1 SSRF 场景1.1.1 PHP 实现 1.2 SSRF 原理1.3 SSRF 危害 2. SSRF 攻防2.1 SSRF 利用2.1.1 文件访问2.1.2 端口扫描2.1.3 读取本地文件2.1.4 内网应用指纹识别2.1.5 攻击内网Web应用 2.2 SSRF 经典案例2.2.1 访问页面2.2.…...

v-model和v-bind
v-model,它其实就是一个语法糖,作用就是双向绑定表单控件(radio, text,address,email,select,checkbox,textarea) v-bind(简写形式:value值),用于绑定属性值,只能实现数据的单项绑定。 <template> <div>…...

详细介绍 弹性盒子(display:flex)
文章目录 什么是弹性盒子 如何使用弹性盒子flex系列flex-direction 对齐方向 水平对齐垂直对齐flex-wrap 换行flex-flowflex模型说明容器的属性 justify-content X轴对齐方式align-content Y轴对齐方式总结属性值Y轴对齐的另外一种:align-itemsalign-content和alig…...

Docker使用数据卷挂载进行数据存储与共享
一、挂载和数据卷 在 Docker 中,挂载(Mounting)和数据卷(Data Volumes)是用于在容器和宿主机之间共享数据的机制。 挂载:将宿主机文件系统中的目录或文件与容器中的目录或文件进行关联的过程。数据卷&…...

[力扣146. LRU 缓存 ](https://leetcode.cn/problems/lru-cache/description/)
力扣146. LRU 缓存 使用LinkedHashmap(HashMap的子类,能够记住插入数据的顺序). LRU是Lease Recently User的缩写,意思是最近 最少使用。比如设计一个文件缓存系统,每个文件有自己的大小和访问时间,文件缓存系统有总的大小&…...

Mysql存储引擎
目录 一、前言 二、存储引擎 1、InnoDB存储引擎 1.1、简介 1.2、优势 1.3、使用方法 1.4、性能 2、MyISAM存储引擎 2.1、优势 2.2、使用方法 2.3、性能 3、MEMORY存储引擎 4、MyISAM 三、比较 四、总结 一、前言 MySQL是开放源代码的关系型数据库管理系统&…...

算法通关村-----数组实现加法专题问题解析
数组实现整数加法 问题描述 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。详见leetcode66 问题…...

倒排表的压缩算法
For压缩算法 这是倒排表的一种压缩算法。 还是那个问题,如果"小米" 这个词项,在多文档里都有,则就会导致倒排表很大,这时候就会设计到了压缩算法,这里说的是,倒排表。 那末我们来看看 for压缩…...

Android studio实现自定义圆形进度条 带刻度进度条 计步效果 时速表 水波纹效果
目录 原文链接效果图values /layout /activity原文链接 效果图 点击重置后: 该项目总共实现了三种圆形进度条效果 CircleProgress:圆形进度条,可以实现仿 QQ 健康计步器的效果,支持配置进度条背景色、宽度、起始角度,支持进度条渐变DialProgress:类似 CircleProgress,…...