1 案例1:Shell基础应用
1.1 问题
本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:
切换用户的Shell环境
练习命令历史、命令别名
重定向标准输入/输出/错误输出
管道操作实践
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:切换用户的Shell环境
什么是shell?
Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令
shell的使用方式:
1.交互执行指令:人工干预,执行效率底。
2.非交互执行指令:安静地在后台执行,执行效率高,方便写脚本。
若需要临时使用另一种Shell环境,可以直接执行对应的Shell解释器程序,比如只要执行ksh可以切换到ksh命令行环境。
[root@svr5 ~]# yum -y install ksh //若缺少ksh请先安装ksh包
… …
[root@svr5 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh //确认当前系统已识别ksh

[root@svr5 ~]# ksh //进入ksh环境
[root@svr5]~# exit //返回到切换前的bash环境
若希望修改用户的登录Shell,管理员可以直接通过usermod(或useradd)命令设置。比如,以下操作可将用户zhangsan的登录Shell改为/bin/ksh:

  1. [root@svr5 ~]# usermod -s /bin/ksh zhangsan //执行修改操作
  2. [root@svr5 ~]# grep ‘zhangsan’ /etc/passwd
  3. zhangsan❌516:516::/home/zhangsan:/bin/ksh //修改后
    步骤二:快捷键与Tab键补齐,常见快捷键如表-1所示
    表-1

步骤三:练习命令历史
1)检查历史命令的容量。
默认记录1000条,通过全局变量HISTSIZE设置,对所有用户有效:
4. [root@svr5 ~]# grep HISTSIZE /etc/profile
5.
6. HISTSIZE=1000
查看已为当前用户记录的历史命令条数:
7. [root@svr5 ~]# history | wc -l
8. 1000
2)查看历史命令列表。
列出最近执行的10条历史命令:
9. [root@svr5 ~]# history | tail
10. 1028 grep ‘zhangsan’ /etc/passwd
11. 1029 cat /etc/redhat-release
12. 1030 usermod -s /bin/tcsh zhangsan
13. 1031 grep ‘zhangsan’ /etc/passwd
14. 1032 su - zhangsan
15. 1033 echo 1234567 | passwd --stdin zhangsan
16. 1034 su - zhangsan
17. 1035 grep HISTSIZE /etc/profile
18. 1036 history | wc -l
19. 1037 history | tail
3)调用指定的历史命令。
重新执行历史命令列表中的第1028条操作:
20. [root@svr5 ~]# !1028
21. grep ‘zhangsan’ /etc/passwd
22. zhangsan❌516:516::/home/zhangsan:/bin/bash
重新执行最近一次以cat开头(根据实际情况变更)的历史命令操作:
23. [root@svr5 ~]# !cat
24. cat /etc/redhat-release
25. Red Hat Enterprise Linux Server… …
4)清空历史的命令。
26. [root@svr5 ~]# history -c //清空自己的历史命令
27. [root@svr5 ~]# > ~/.bash_history //清空记录文件
28. [root@svr5 ~]# history //再次检查历史命令列表
29. 42 > ~/.bash_history
30. 43 history
步骤四:练习命令别名
1)查看已经定义的命令别名列表。
当前的别名列表:
31. [root@svr5 ~]# alias
32. alias cp=‘cp -i’
33. alias l.=‘ls -d .* --color=tty’
34. alias ll=‘ls -l --color=tty’
35. … …
别名设置一般存放在用户的.bashrc文件内:
36. [root@svr5 ~]# grep ‘^alias’ ~/.bashrc
37. alias rm=‘rm -i’
38. alias cp=‘cp -i’
39. alias mv=‘mv -i’
2)自定义新的命令别名
添加一个名为lh的命令别名,实际执行的是“ls -lh”:
40. [root@svr5 ~]# alias lh=‘ls -lh’ //定义别名命令lh
41. [root@svr5 ~]# alias lh //确认定义结果
42. alias lh=‘ls -lh’
验证别名命令的效果:
43. [root@svr5 ~]# lh /etc/fstab //使用别名
44. -rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
45. [root@svr5 ~]# ls -lh /etc/fstab //使用完整的命令
46. -rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
3)取消别名
取消单个别名:
47. [root@svr5 ~]# unalias lh //取消名为lh的命令别名
48. [root@svr5 ~]# alias lh //查询时已没有lh
49. -bash: alias: lh: not found
步骤四:重定向标准输入/输出/错误输出
标准输入(stdin),描述号为0;
标准输出(stdout),描述号为1;
标准错误(stderr),描述号为2。
1)重定向标准输出。
使用 > 将命令执行的正常输出重定向到文件:
50. [root@svr5 ~]# ls -ld /etc/ //正常应输出到屏幕
51. drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/
52. [root@svr5 ~]# ls -ld /etc/ > stdout.txt //重定向到文件
53. [root@svr5 ~]# cat stdout.txt //确认重定向输出的结果
54. drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/

操作会覆盖目标文件(先清空、再写入):

  1. [root@svr5 ~]# echo “I am the king.” > stdout.txt //覆盖目标文件
  2. [root@svr5 ~]# cat stdout.txt //确认结果
  3. I am the king.
    改用 >> 可实现追加重定向输出:
  4. [root@svr5 ~]# ls -ld /etc/ >> stdout.txt //追加输出
  5. [root@svr5 ~]# cat stdout.txt
  6. I am the king. //原有内容还保留
  7. drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/
    2)重定向标准错误。
    对于命令执行出错的信息,使用 > 无法保存,仍然会输出到屏幕。比如,可使用ls命令同时查看两个对象(其中nb.txt并不存在),重定向输出:
  8. [root@svr5 ~]# ls -l nb.txt /etc/fstab > stderr.txt
  9. [root@svr5 ~]# cat stderr.txt //正常信息成功重定向到目标文件
  10. -rw-r–r--. 1 root root 541 1月 5 2017 /etc/fstab
    使用 2> 可重定向错误信息,比如,可执行一个错误的命令:
  11. [root@svr5 ~]# ls -l nb.txt /etc/fstab 2> stderr.txt
  12. -rw-r–r--. 1 root root 541 1月 5 2017 /etc/fstab
  13. //正确的信息默认输出至屏幕,错误信息重定向到目标文件
  14. [root@svr5 ~]# cat stderr.txt //从文件中查看出错信息
  15. ls: nb.txt: 没有那个文件或目录
    类似的,2>> 可实现追加输出:
  16. [root@svr5 ~]# ls tmpfile 2>> stderr.txt
  17. [root@svr5 ~]# cat stderr.txt
  18. ls: nb.txt: 没有那个文件或目录
  19. ls: tmpfile: 没有那个文件或目录
    若希望将正常输出、错误输出重定向同一个文件,可使用 &> :
  20. [root@svr5 ~]# ls -l nb.txt /etc/fstab &> stderr.txt
  21. [root@svr5 ~]# cat stderr.txt
  22. ls: nb.txt: 没有那个文件或目录
  23. -rw-r–r--. 1 root root 541 1月 5 2017 /etc/fstab
    3)重定向标准输入。
  24. [root@svr5 ~]# mail -s Error root < /etc/passwd
    4)案例
  25. [root@svr5 ~]# cat /root/test.sh
  26. #!/bin/bash
  27. for i in {1…10}
  28. do
  29.         useradd  user$i  2>>/root/user.log
    
  30.         echo  '123456' | passwd  --stdin  user$i  >/dev/null
    
  31. done
    步骤五:管道操作实践
    借助于管道符“|”,可以将一条命令的标准输出交给另一条命令处理,在一条命令行内可依次使用多个管道。
    1)统计/etc/目录下资料的数量。
  32. [root@svr5 ~]# ls -l /etc | wc -l
  33. 254
    2)列出Yum库里名称中含cluster的软件包。
  34. [root@svr5 ~]# yum list | grep cluster
  35. cluster-cim.x86_64 0.12.1-7.el5 RHEL5-Cluster
  36. cluster-snmp.x86_64 0.12.1-7.el5 RHEL5-Cluster
  37. … …
    2 案例2:简单Shell脚本的设计
    2.1 问题
    本案例要求编写三个脚本程序,分别实现以下目标:
  38. 在屏幕上输出一段文字“Hello World”
  39. 能够为本机快速配好Yum仓库
  40. 能够为本机快速装配好vsftpd服务
    2.2 方案
    一个规范的Shell脚本构成包括:
    • 脚本声明(需要的解释器、作者信息等)
    • 注释信息(步骤、思路、用途、变量含义等)
    • 可执行语句(操作代码)
    2.3 步骤
    实现此案例需要按照如下步骤进行。
    步骤一:编写第一个Shell脚本,输出“Hello World”
    1)根据手动任务操作编写脚本文件
  41. [root@svr5 ~]# vim /root/first.sh
  42. #!/bin/bash
  43. echo ‘Hello World’
  44. exit
  45. [root@svr5 ~]# chmod +x /root/first.sh //添加可执行权限
    2)执行脚本,测试效果
  46. [root@svr5 ~]# /root/first.sh
  47. Hello World
    3)Shell脚本的执行方式:
    方法一,作为“命令字”:指定脚本文件的路径,前提是有 x 权限
  48. [root@svr5 ~]# ./first.sh //指定相对路径
  49. [root@svr5 ~]# /root/first.sh //指定绝对路径
    方法二,作为“参数”:使用bash、sh、source来加载脚本文件
  50. [root@svr5 ~]# bash first.sh //开启子进程
  51. [root@svr5 ~]# sh first.sh //开启子进程
  52. [root@svr5 ~]# source first.sh //不开启子进程
    步骤二:编写为本机快速配Yum仓库的Shell脚本
    1)Yum仓库配置文件的参考内容如下:
  53. [root@svr5 ~]# cat /etc/yum.repos.d/rhel.repo
  54. [rhel]
  55. name=redhat
  56. baseurl=file:///misc/cd //yum源不一样,不能直接抄!!!
  57. enabled=1
  58. gpgcheck=0
    2)根据参考文件的内容,编写脚本内容如下:
  59. [root@svr5 ~]# vim /root/yum.sh
  60. #!/bin/bash
  61. rm -rf /etc/yum.repos.d/*.repo
  62. echo '[rhel]
  63. name=redhat
  64. baseurl=file:///misc/cd
  65. gpgcheck=0
  66. ’ > /etc/yum.repos.d/rhel.repo
  67. [root@svr5 ~]# chmod +x /root/yum.sh //添加可执行权限
    3)执行脚本,测试效果
    执行配置Yum仓库的脚本:
  68. [root@svr5 ~]# /root/yum.sh
    检查配置结果:
  69. [root@svr5 ~]# ls /etc/yum.repos.d/* //仓库配置已建立
  70. /etc/yum.repos.d/rhel.repo
  71. [root@svr5 ~]# yum repolist //Yum仓库已可用
  72. rhel-packages | 3.9 kB 00:00 …
  73. rhel-packages/primary_db | 3.1 MB 00:00 …
  74. repo id repo name status
  75. rhel redhat 3,690
  76. repolist: 3,690
    步骤三:编写快速装配vsftpd服务的Shell脚本
    1)编写参考脚本文件如下:
  77. [root@svr5 ~]# vim /root/ftpon.sh
  78. #!/bin/bash
  79. yum -y install vsftpd &> /dev/null
  80. systemctl start vsftpd
  81. systemctl enable vsftpd
  82. cp /etc/hosts /var/ftp/pub
  83. #拷贝一个文件,放到FTP共享目录下
  84. [root@svr5 ~]# chmod +x /root/ftpon.sh //添加可执行权限
    3)执行脚本,测试效果
    执行快速装配vsftpd服务的脚本:
  85. [root@svr5 ~]# /root/ftpon.sh
    确认脚本执行结果:
  86. [root@svr5 ~]# rpm -q vsftpd
  87. vsftpd-3.0.2-10.el7.x86_64
  88. [root@svr5 ~]# systemctl status vsftpd
    3 案例3:使用Shell变量
    3.1 问题
    本案例要求熟悉Shell变量的使用,主要练习或验证下列内容:
  89. 定义/赋值/查看变量
  90. 环境/预定义/位置变量的应用
    除了学会建立和引用变量以外,还要认识环境变量PWD、USER、HOME、SHELL,还有预定义变量 0 、 0、 0、 、 、 、?、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、*,以及位置变量$1、$2、$10、……的作用。
    3.2 步骤
    实现此案例需要按照如下步骤进行。
    步骤一:变量的定义/赋值/查看
    1)新建/赋值变量
    新建变量test,赋值“hello world”,通过set命令可以检查变量设置:
  91. [root@svr5 ~]# test=11
    2)查看变量
    通过echo $变量名 可输出变量值:
  92. [root@svr5 ~]# echo $test
  93. 11
    查看变量时,若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分:
  94. [root@svr5 ~]# echo $testRMB //无法识别变量名test
  95. [root@svr5 ~]# echo ${test}RMB //区分后可以识别
  96. 11RMB
    3)撤销自定义变量
    若要撤销已有的变量,可使用unset命令:
  97. [root@svr5 ~]# unset test //撤销变量test
  98. [root@svr5 ~]# echo $test //查看时已无结果
    步骤二:使用环境变量
    1)查看环境变量相关文件
    全局文件为/etc/profile,对所有用户有效;用户文件为~/.bash_profile,仅对指定的用户有效。
    查看/etc/profile文件内容:
  99. [root@svr5 ~]# cat /etc/profile
  100. … …
  101. HOSTNAME=/bin/hostname
  102. HISTSIZE=1000
  103. … …
  104. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
  105. … …
    2)使用环境变量
    当前用户的环境变量USER记录了用户名、HOME记录了宿主目录、SHELL记录了登录Shell、HOSTNAME记录主机名、UID是用户的id号:
  106. [root@svr5 ~]# echo $USER $HOME $SHELL $UID
  107. root /root /bin/bash 0
  108. [root@svr5 ~]# echo $HOSTNAME
  109. svr5
    环境变量PS1表示Shell环境的一级提示符,即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、$ 权限标识):
  110. [root@svr5 src]# echo $PS1 //查看默认的一级提示
  111. [\u@\h \W]$
  112. [root@svr5 src]#PS1=‘hehe#’ //修改一级提示
  113. hehe# //更改结果
  114. hehe# PS1=’[\u@\h \W]$ ’ //恢复原有设置
  115. [root@svr5 src]#
    环境变量PS2表示二级提示符,出现在强制换行、at任务编辑等场合:
  116. [root@svr5 ~]# echo $PS2 //查看默认的二级提示
  117. [root@svr5 src]# cd \ //强制换行,观察提示符效果
  118. /root/

  119. [root@svr5 ~]# PS2=’=> ’ //手动修改二级提示
  120. [root@svr5 ~]# cd \ //再次验证提示符效果
  121. => ~
  122. [root@svr5 ~]# PS2=’> ’ //恢复原有设置
    3)查看系统变量
    使用env可查看所有环境变量:
  123. [root@svr5 src]# env
  124. HOSTNAME=svr5.tarena.com
  125. SHELL=/bin/bash
  126. HISTSIZE=1000
  127. SSH_CLIENT=192.168.4.110 59026 22
  128. OLDPWD=/root
  129. SSH_TTY=/dev/pts/0
  130. USER=root
  131. … …
    使用set可查看所有变量(包括env能看到的环境变量):
  132. [root@svr5 src]# set
  133. BASH=/bin/bash
  134. BASH_ARGC=()
  135. BASH_ARGV=()
  136. BASH_LINENO=()
  137. … …
    步骤三:使用位置变量与预定义变量
    1)创建一个测试脚本,用来展示。
  138. [root@svr5 ~]# vim location.sh
  139. #!/bin/bash
  140. echo $0 //脚本的名称
  141. echo $1 //第一个参数
  142. echo $2 //第二个参数
  143. echo $* //所有参数
  144. echo $# //所有的综合
  145. echo $$ //当前进程的进程号
  146. echo $? //上一个程序的返回状态码
  147. [root@svr5 ~]# chmod +x location.sh //添加可执行权限
    2)执行脚本location.sh,细心观察结果(高明的武功需要用心参悟)。
  148. [root@svr5 ~]# ./location.sh one 1 2 abc qq 8 7
    步骤四:创建账户与修改密码的脚本
    1)编写脚本。
  149. [root@svr5 ~]# vim /root/user.sh
  150. #!/bin/bash
  151. useradd $1
  152. echo “$2” |passwd --stdin $1
    执行脚本测试:
  153. [root@svr5 ~]# ./user.sh jerry 123456
  154. 更改用户 jerry 的密码 。
  155. passwd: 所有的身份验证令牌已经成功更新。
    4 案例4:变量的扩展应用
    4.1 问题
    本案例要求进一步熟悉Shell变量的赋值控制,主要练习或验证下列内容:
  156. 三种引号对赋值的影响
  157. 使用read命令从键盘读取变量值
  158. 使用export发布全局变量
    4.2 步骤
    实现此案例需要按照如下步骤进行。
    步骤一:三种引号对变量赋值的影响
    1)双引号的应用
    使用双引号可以界定一个完整字符串。
  159. [root@svr5 ~]# xx=Tarena IT Group
  160. -bash: IT: command not found //未界定时赋值失败
  161. [root@svr5 ~]# xx=“Tarena IT Group” //界定后成功
  162. [root@svr5 ~]# touch aa bb //创建了两个文件
  163. [root@svr5 ~]# touch “aa bb” //创建了一个文件
  164. [root@svr5 ~]# ls //查看结果
    2)单引号的应用
    界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。
  165. [root@svr5 ~]# test=11
  166. [root@svr5 ~]# echo “$test”
  167. [root@svr5 ~]# echo ' t e s t ′ 3 ) 反 撇 号 或 test' 3)反撇号或 test′3)反撇号或()的应用
    使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。
  168. [root@svr5 ~]# tar -czf log-date +%Y%m%d.tar.gz /var/log
    步骤二:使用read命令从键盘读取变量值
    1)read基本用法
    执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str:
  169. [root@svr5 ~]# read str
  170. What’s happen ? //随便输入一些文字,按Enter键提交
  171. [root@svr5 ~]# echo $str //查看赋值结果
  172. What’s happen ?
    为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示:
  173. [root@svr5 ~]# read -p “请输入一个整数:” i
  174. 请输入一个整数:240
  175. [root@svr5 ~]# echo $i
  176. 240
    2)stty终端显示控制
    将回显功能关闭(stty -echo),
    将回显功能恢复(stty echo)。
    可参考下列操作创建一个测试脚本:
  177. [root@svr5 ~]# vim user.sh //创建一个测试脚本
  178. #!/bin/bash
  179. read -p “请输入用户名:” username //读取用户名
  180. stty -echo //关闭回显
  181. read -p “请输入密码:” passwd //读取密码
  182. stty echo //恢复回显
  183. echo “” //恢复回显后补一个空行
  184. useradd “$username”
  185. echo “ p a s s w d " ∣ p a s s w d − − s t d i n " passwd" | passwd --stdin " passwd"∣passwd−−stdin"username”
  186. [root@svr5 ~]# chmod +x user.sh //添加执行权限
    执行测试脚本user.sh,验证效果:
  187. [root@svr5 ~]# ./user.sh
  188. 请输入用户名: root //输入root,回车
  189. 请输入密码: //输入1234567(不会显示),回车
    步骤三:使用export发布全局变量
    默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。比如已定义的SCHOOL变量,当进入到sh或bash子Shell后,变量SCHOOL将处于未定义的状态:
  190. [root@svr5 ~]# yy=“Tarena IT Group”
  191. [root@svr5 ~]# echo $yy
  192. Tarena IT Group
  193. [root@svr5 ~]# bash //开启bash子进程
  194. [root@svr5 ~]# echo $yy //查看SCHOOL变量值无结果
  195. [root@svr5 ~]# exit //返回原有Shell环境
  196. exit
  197. [root@svr5 ~]# echo $yy
    若希望定义的变量能被子进程使用,可以使用export命令将其发布为全局变量。使用export发布时,只需指定变量名(可以有多个)即可,也可以通过export命令直接设置新的全局变量:
  198. [root@svr5 ~]# export yy //发布已定义的变量
  199. [root@svr5 ~]# export XX=“1234” //发布新变量
    验证刚刚发布的全局变量:
  200. [root@svr5 ~]# bash //进入bash子Shell环境
  201. [root@svr5 ~]# echo $yy //查看全局变量的值 … …
  202. Tarena IT Group
  203. [root@svr5 ~]# echo $XX
  204. 1234

NSD SHELL DAY(一)相关推荐

  1. shell基础之04

    1.字串截取 方法一 echo ${key:0:3} 语法:echo ${变量:起始位(从0开始): 长度}  [root@localhost test1]# phone=18318616159 [r ...

  2. 数值运算 条件测试 、 if选择结构

    " "双引 引整体 "a b c" != a b c abc == "abc" 以后最好加"",防止出现错误 '' 单引 ...

  3. sed基本用法 sed文本块处理 、 sed高级应用

    sed 文本编辑器(vim) 增,删,改,查 特色:流处理器[逐行处理的流处理器] 各种编辑器notepad,notepad++,word,atom vim,vi,gedit,sed 非交互的(sed ...

  4. 字符串处理、变量初始值处理、扩展的脚本技巧、正则表达式

    ################################################### shell  脚本编程 一.字符串处理 1.字符串截取及切割 1)子串截取 子串截取的三种用法: ...

  5. 字符串处理 扩展的脚本技巧 正则表达式

    字串处理 1.截取字串 echo ${变量:0 : 3} == echo ${变量::3} //0可以省略 expr substr $变量 1 3 echo $变量 | cut -b 1-3 A=随机 ...

  6. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用...

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境        2> 练习命令历史.命令别名        ...

  7. Android_adb shell dumpsys介绍

    1.dumpsys是Android系统的调试工具,提供有关系统服务的信息,默认打印出当前系统所有service信息,可以在后面加上具体的服务名. 官方介绍:https://developer.andr ...

  8. ubuntu shell命令大全

    原文地址:ubuntu shell命令大全 作者:sun5411 转自:http://blog.chinaunix.net/uid-22330495-id-141752.html 前言 下面的命令大都 ...

  9. ubuntu退出shell终端命令_ubuntu shell 命令大全

    下面的命令大都需要在 控制台 / 终端 / shell 下输入. 控制台, 终端, 和 shell 意味着同样一件事 -  一个命令行界面, 他可以用来控制系统. 打开一个控制台: 应用程序 --&g ...

最新文章

  1. 50年前的登月程序和程序员有多硬核?
  2. 对顶层生存空间的考虑---及蜷缩在内层的EJB
  3. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
  4. Android柳叶刀之Button之UI交互
  5. linux中怎么给用户设置不同的权限,linux怎么将一个文件设置为多个人拥有或者同一组内只让某两个用户有删除权限?...
  6. java谓词_在Java中谓词
  7. linux 下清空回收站命令
  8. Java Arrays.sort()函数
  9. 实现多国语言的Reporting Services项目
  10. SPSS基础教程:SPSS的启动与退出
  11. python安装pyltp_windows 安装pyltp详细教程
  12. 《编程之美》买书问题及c语言代码实现
  13. DataGridView 获取当前行数据
  14. 1分钟激活任意Windows 系统
  15. 2021年东莞高新企业补贴政策
  16. LSwarm:复杂城市场景下覆盖受限的大集群高效避碰(Swarm-2019)
  17. 玩玩python之两个猥琐的爬虫
  18. [转载] 常用CASE工具介绍
  19. [SCOI2012]喵星球上的点名——堪称十种方法做的题
  20. 前端js导出Excel库(js-export-excel)在React/Vue中使用参考

热门文章

  1. Flutter开发记录part2
  2. 数商云分析:亏损30亿到盈利144亿,李宁做了什么
  3. 华为处理器鸿蒙,华为环绕屏新机:三摄加麒麟9000处理器鸿蒙系统到来!
  4. 仙之侠道2玖章各个任务详情_《仙之侠道Ⅱ柒章》任务全攻略 新手必看
  5. http-flv协议源码实现(可通过网页播放视频)
  6. 微信小程序自动化框架的搭建python+minium
  7. js周岁计算封装非常实用介意点赞收藏!!!
  8. 【硬件】- 英特尔CPU命名规则
  9. Spring securty<六> 认证--手机号+验证码
  10. 自动化测试遇到手机号验证码怎么办?