ShellScript-技巧积累
System Unit File 的注意事项
ExecStart
指令中的命令不直接支持使用 shell 特性 (如重定向符号 >
, >>
, |
等), 因为 ExecStart
默认不会通过 shell 执行, 而是直接以二进制的方式调用指定的命令.
格式化 JSON 文件
1 |
|
Ubuntu 查看具体库文件位置
1 |
|
库文件的查找路径为:
1 |
|
Ubuntu 安装 deb 包
1 |
|
如果有依赖问题:
1 |
|
生成数字序列
1 |
|
set -e
set -e
能让脚本在遇到任何错误 (任何命令返回非零状态码) 时立即退出.
获取文件名不包含后缀的部分
一种是用通配符:
1 |
|
%
后面的模式表示从变量的值的末尾开始匹配模式并删除匹配部分
另一个方法是用 basename
命令:
1 |
|
zip 过滤不打包的文件
1 |
|
exclude.lst
文件中指定要过滤的匹配项, 如:
1 |
|
过滤掉以 hello
和 world
开头的文件, 以及 mm
目录.
Maybe, 限制用户执行的命令
1 |
|
解释几点:
$BASH_COMMAND
是一个 Bash 内置变量, 表示当前执行的命令, 比如脚本里若有一行echo $BASH_COMMAND
, 则输出同样为echo $BASH_COMMAND
kill -SIGINT $$
, 发送一个SIGINT
信号给当前的进程, 通常是终止进程
对于 trap restrict_commands DEBUG
:
trap
命令用于在收到指定信号 (这里是DEBUG
) 后执行一段操作 (这里是restrict_commands
)DEBUG
信号, 会在执行一条命令之前触发
查看和清除 DNS 缓存
利用 DNS 缓存进行查询:
1 |
|
清除 DNS 缓存:
1 |
|
删除字体缓存并重新生成字体缓存
1 |
|
之后可查看:
1 |
|
docker 导入 tar 包到本机的 docker 镜像仓库
1 |
|
验证文件完整性
一般用文件计算 MD5 值或者 SHA1 值来验证完整性, 如:
1 |
|
以及:
1 |
|
docker 拉取镜像时指定平台
1 |
|
docker 删除指定镜像
1 |
|
查看 docker 镜像支持的平台
1 |
|
递归查看文件大小
1 |
|
查看 .tar.gz 压缩包中含有哪些文件
1 |
|
Ubuntu 查找某命令来自哪个包
可以用 apt-file
命令来查找:
1 |
|
判断地址冲突
用 arping
命令:
1 |
|
若输出有多个 MAC, 说明冲突.
可用:
1 |
|
查看本地的 arp 表内容.
指定网络接口和端口抓包
1 |
|
-i
,--interface
, 指定接口-nn
,--number
, 以数字形式显示, 不将 IP 地址和端口号解析为主机名和服务名port 80
, 指定端口
查看响应头
1 |
|
输出:
1 |
|
查看与软件包相关的软件和信息
1 |
|
即查看 httpd
这个包内有哪些文件. -ql
是 “query list”.
1 |
|
查看 httpd
这个包的一些基础信息. -qi
是 “query info”
过滤出文件所有非注释以及空行
1 |
|
显示网络接口的统计信息
1 |
|
-s
指-stats
,-statistics
指定某个用户权限运行
用 sudo -u <uid|name>
, 如:
1 |
|
VIM 进入 EX 模式
命令行进入为:
1 |
|
vim 中快捷键进入如:
1 |
|
Symbolic link 的注意事项
由于 Symbolic link 的本质就是创建一个存储源文件路径信息的文件, 一次指定源文件时需要用绝对路径:
1 |
|
启用 vi 快捷键模式
1 |
|
查看服务是否启用
1 |
|
grep 返回匹配之外的行
如:
1 |
|
查看当前目录下各目录大小
1 |
|
grep 显示匹配项后 n 行
如:
1 |
|
systemctl 分析服务间的依赖
语法为:
1 |
|
如:
1 |
|
default.target
就是指 systemctl get-default
的输出, 这里是 graphical.target
通过 systemctl 观察系统上所有的服务
语法为:
1 |
|
可用的 command
有:
list-units
, 列出目前启动的 unit, 若加上--all
则会同时列出没启动的list-unit-files
, 根据/usr/lib/systemd/system
目录内的文件内容来列表说明
可指定的 unit type 主要有 service
, socket
, target
.
列出系统上所有的 unit
1 |
|
列出系统上所有的 unit 以及其状态
1 |
|
将系统上所有 unit 分类后列出
1 |
|
若指查看某一类型, 有:
1 |
|
wget 继续上次中断的下载
1 |
|
-c
,--continue
只获取 ip 地址
1 |
|
调整进程优先级
使用 nice
和 renice
命令.
优先级从 -20 (最高), 到 19 (最低), 默认为 0.
nice
用于先设置优先级然后运行一个命令如:
1 |
|
-n
,--adjustment=N
renice
用于修改正在运行的进程的优先级:
1 |
|
cron 服务
cron 会搜索:
/var/spool/cron
目录下, 以/etc/passwd
文件中用户名命名的 crontab 文件/etc/crontab
文件
(注意两个文件语法略有不同, 前者不需要加执行用户)
常用选项:
-u
, 指定一个用户, 同时指定一个 crontab 文件来运行-e
, “edit”, 编辑当前用户的 crontab-l
, “list”, 列出当前用户的 cron 服务详细内容-r
, “remove”, 删除当前用户的 crontab
at 命令指定时间以及运行
指定时间不需要开启任何选项, 可以用 -f
“file” 从文件中读取要执行的命令或者从 STDIN 读取:
1 |
|
6/7/12
为 M/D/Y
. 相对计时还可以为 minutes, hours, days, weeks, today.
查看 job 列表:
1 |
|
(这里不会显示出具体的命令, 但会有 job 编号)
查看某个 job 要执行的具体命令:
1 |
|
-c
可能指 “command”.
移除一个 job 可以为:
1 |
|
-r
可能指 “remove”.
用 at.allow
和 at.deny
控制 at
的执行权限, 文件内容为一行一个用户名, 如:
1 |
|
字符转译
用 tr
命令, 如将小写转换为大写:
1 |
|
wc 常见选项
-l
,--lines
, 只统计行数-w
,--words
, 统计单词数
提取列或字段
用 cut
命令, 常用选项有:
-d
,--delimiter=DELIM
指定分隔符, 如指定:
则为-d:
-f
,--fields=LIST
, 显示指定的 filed, 如-f 1,2
修改文件时间戳
格式:
1 |
|
如同时更改访问时间和修改时间:
1 |
|
只更改访问时间:
1 |
|
-a
指 “access”
只更改修改时间:
1 |
|
-m
, 指 “modify”
查看当前主机的 ssh 连接数
1 |
|
查看与 ssh 相关的线程
1 |
|
引用另一个脚本的内容
可以用 source
, 或者直接运行脚本, 如 test1.sh
文件为:
1 |
|
在 test2.sh
中调用 test1.sh
文件中定义的变量:
1 |
|
函数创建
两种格式:
第一种格式采用关键字 function:
1
2
3function name {
commands
}第二种格式:
1
2
3name() {
commands
}函数名后的空括号表明正在定义一个函数.
注意函数调用时不能加上括号.
tee 命令使用
tee
命令能将输入同时输入到标准输出以及一个或多个文件中. (默认会覆盖原文件内容)
常用参数:
-a
, 追加到文件中-i
, 忽略中断信号-p
, 允许继续使用管道
1 |
|
创建临时文件
用 mktemp
:
1 |
|
加上 -t
参数会强制在系统的临时目录创建并返回绝对路径.
同时重定向 STDOUT 和 STDERR
使用 &>
这个符号.
结合分隔符和 for 语句
1 |
|
在命令行查看 bash shellscript 的语法
1 |
|
C 语言风格的 for 循环
1 |
|
区分 [], [[]] 和 (()) 的作用
[]
[ condition ]
等价于 test condition
命令, condition 成立则返回 0.
[[]]
[[ condition ]]
, 其也用于条件测试, 但是相比 [ condition ]
支持逻辑运算符以及模式匹配等.
常用字符串比较如:
1 |
|
(())
(( 1+1 ))
用于数学运算和数字比较, 如:
1 |
|
常用数字比较有:
1 |
|
命令替换,变量内插和数学运算语句的区别
命令替换为 $(command)
.
变量内插为 ${var}
.
数学运算为 $[1+1]
! 系列命令
!!
, 执行上一条命令!n
, 执行历史记录中的第 n 条命令!string
, 执行最近的以指定字符串开头的命令
常见特殊变量
$0
, 脚本名$1
,$2
… 脚本参数$@
, 以数组形式包含全部参数$#
, 参数长度$?
, 最后一个命令的运行状态$$
, 当前脚本的进程 ID$!
, 最后一个在后台运行的进程的进程 ID$*
, 以字符串形式包含全部参数$IFS
, 内部字段分隔符
花括号扩展语法
在这种语法中, 花括号内部的内容会被扩展成多个字符串, 每个字符串通过逗号分隔.
如创建两个不同后缀的文件, 可以写为:
1 |
|
其会创建 hello.c
和 hello.pl
两个文件.
或创建连续数字:
1 |
|
其会创建 hello1
, hello2
, hello3
三个文件.
显示数组的所有元素
1 |
|
删除数组元素
用 unset
, 元素被删除后, 后面的元素不会自动往前挪:
1 |
|
此时 ${arr[1]}
没有对应值.
列出所有普通用户
1 |
|
直接 enable 并启动应用
如:
1 |
|
直接修改 hostname 以及时区
1 |
|
Firewalld
Firewalld 是基于 Netfilter 框架的动态防火墙管理器,它使用 iptables 作为底层的数据包过滤引擎。Firewalld 提供了一个抽象的、高级的防火墙管理接口,并通过使用 iptables 或其他后端工具来实际修改底层的防火墙规则。
nmcli 命令
其为 NetWorkManager 的命令行工具.
挂载 ISO 镜像
如:
1 |
|
-t
(type) 指定文件系统类型.
-o
(options) 指定挂载的参数, loop
选项表示将文件作为块设备挂载,ro
选项表示以只读模式挂载
变量内插
直接写成 ${Varname}
就可以, 如:
1 |
|
更换重定向输出
如:
1 |
|
将标准错误输出(stderr)重定向到标准输出(stdout),也就是将标准错误输出和标准输出合并为一起输出。
具体地说,2
表示标准错误输出的文件描述符,>
表示重定向输出,&1
表示将输出重定向到标准输出的文件描述符上,其中 &
表示这是一个文件描述符,而不是一个文件名。
注意这里的 2>&1
放命令末尾.