2021-07-03 SHELL 脚本常用
Posted 从零开始的智障生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-07-03 SHELL 脚本常用相关的知识,希望对你有一定的参考价值。
SHELL脚本,常用规范:
- 第一行声明SHELL,如:#!/bin/bash
- 脚本功能;
- 脚本的版本信息;
- 脚本作者与联络方式;
- 脚本的版权声明方式;
- 脚本的History(历史记录);
- 脚本内较特殊的命令,使用【绝对路径】的方式来执行;
- 脚本运行时需要的环境变量PATH预先声明与设置。
常用SHELL命令:
指令 | 描述 | 参考 |
---|---|---|
netstat -tuln | 本机启动的网络服务(端口80:WWW、22:ssh、21:ftp、25:mail、111:PRC(远程)、631:CUPS(打印)) | P403 |
指令 | 描述 | 参考 |
---|---|---|
history | 能够记录使用过的指令 | P314 |
alias | 设置命令别名 | P314 |
type | 查询命令是否为BASH shell内置命令 | |
od | 针对非纯文件文件进行处理 | P191 |
file | 查看文件类型 | P200 |
ulimit | 限制用户资源(开启文件数、CPU使用时间、可用内存数) | P329 |
bash | 启动子进程(exit退出) | |
source | 读取环境配置文件 如(source ~./bashrc) | P341 |
time | 显示程序运行时间 | P267 |
last | 显示登陆者信息 | P352 |
split | 拆分文件,如果文件太大,如一个4GB的文本文档,内存较小,可以进行拆分。 | P357 |
id(非管道命令) | 查看uid,gid等id信息 | P358 |
xargs(管道命令) | 读取stdin的数据,并以某种空格或换行符作为分隔符,将其作为参数,提供给后面的命令command 通过-n说明,按1个一个赋予参数。常用于为非管道命令提供stdin使其可以使用标准输入。 | P358 |
dmesg | 列出内核信息 | |
sh | 开启子进程,运行shell脚本文件,运行结束后,子进程bash消失 | P392 |
test | 测试文件属性,并返回结果,常与&&和||结合在一起 | P396 |
运算符 | 描述 | 参考 |
---|---|---|
${var} | 取变量值 | P318 |
var=value | var="myname is $uname" 设置变量值 | P319 |
| 将echo参数内容没有管道则导入到屏幕,如果有管道则传给管道后面作为其stdin | P394 |
\\\\ | 转义特殊变量值符号 | P319 |
\\[Enter] \\$ \\\\ \\(一个看不见的空格) | \\' 换行、$、\\、空格、单引号 | P319 |
var="$var"value | (如PATH="$PATH":/home/bin,其中value是【:/home/bin】 (有个冒号)) 变量追加内容 | P319 |
export var | 使变量称为环境变量 | P319 |
unset var | 取消变量 | P318 |
$(command) `command` | 取命令执行结果 | P320 |
${var#keyword}(一般是用通配符*) | 删除${var}从左向右的一个符合keyword的最短匹配项 | P332 |
${var##keyword} | 删除${var}从左向右的一个符合keyword的最长匹配项 | P332 |
${var%keyword} | 删除${var}从右向左的一个符合keyword的最短匹配项 | P332 |
${var%%keyword} | 删除${var}从右向左的一个符合keyword的最长匹配项 | P332 |
${var/旧字符串/新字符串} | echo ${path/bin/BIN}, 替换${var}从左往右第一个匹配的旧字符串 | P332 |
${var//旧字符串/新字符串} | echo ${path//bin/BIN}, 替换${var}从左往右全部匹配的旧字符串 | P332 |
var2=${var1-str} | var1未设置则var2=str,设置则var2=$var1 | P333 |
var2=${var1:-str} | var1未设置或空串则var2=str,非空则var2=$var1 | P333 |
var2=${var1+str} | var1未设置则var2=,设置则var2=str | P333 |
var2=${var1:+str} | var1未设置或空串则var2=,非空则var2=str | P333 |
var2=${var1=str} | var1未设置则var2=var1=str,设置则var2=$var1 | P333 |
var2=${var1:=str} | var1未设置或空串则var2=var1=str,设置则var2=$var1 | P333 |
var2=${var1?str} | var1未设置则str输出到stderr,设置则var2=$var1 | P333 |
var2=${var1:?str} | var1未设置或空串则str输出到stderr,设置则var2=$var1 | P333 |
read | 读取来自键盘输入的变量 | P328 |
declare,typeset | 声明变量的类型 | P328 |
var[i]=value | 设置数组值,从1计数 | P329 |
| 两个变量${num1}和${num2}相乘(声明整型) | P393 |
| 两个变量${num1}和${num2}相乘(双层括号代表数值运算) | P393 |
| 用bc计算数值运算结果 | P393 |
sh | 运行bash文件*.sh,结束后,定义的变量被释放 | P395 |
source | 运行bash文件*.sh,结束后,定义的变量依然存在 | P395 |
$0 | 表示第0个参数,即代表这个被执行的sh文件 | |
$1 $2 $3 .... | 代表bash指令的第1、2、3个参数 param1 param1 param2 | P399 |
$# | 代表bash指令参数个数(被执行文件后面的参数),$#是6 | P399 |
$@ | 代表所有的变量,如"$1""$2""$3",但都是独立的。注意没有"$0" | P399 |
$* | 代表所有的变量,如"$0c$1c$2c$3",是用分隔符c隔开的整体 | P399 |
shift | 参数偏移(删除),不带参数表示偏移一个值,上面的例子中$#变成5,偏移的是$1,而不是$0 偏移掉param1,加上选项-n后,又偏移3个,偏移掉param2 param3 param4,$#成为2 | P400 |
运算符 | 描述 | 参考 |
---|---|---|
$? | 上一条执行过的指令的返回值 上一条命令运行错误,返回值为127 | P349 |
cmd1&&cmd2 | 若cmd1正确,cmd2执行;cmd1错,则cmd2不执行。(与的意思) | P349 |
cmd1||cmd2 | 若cmd1正确,cmd2不执行;cmd2错,则cmd2执行(异或的意思) | P349 |
test | 测试文件属性,或者判断整数之间以及字符串之间关系,常与上面逻辑运算结合 | P396 |
[] | 判断符号,[]内每个组件都要有空格来隔开,变量最好用双引号括起来,常数用单或双引号括起来,作为一个个参数。 在bash中两个等号与一个等号同意义,描述上双等号作判断好点。 -o是或的意思。 | P398 |
指令 | 描述 | 参考 |
---|---|---|
cat (concatenate) | 由第一行显示文件内容 | P187 |
tac | 从最后一行显示文件内容文件内容 | P188 |
nl | 与cat相似,但偏向于针对行号处理 | P188 |
more | 一页一页显示文件内容,但不能对管道回翻 | P189 |
less | 一页一页显示文件内容,可以向上翻页 | P189 |
grep | 可以按关键字,检索stdin的行,当然也可以检索关键字 | P35 |
SHELL中可以检索文件字符串功能的指令
指令 | 描述 | 参考 |
---|---|---|
more | 一页一页显示文件内容,但不能对管道回翻 | P189 |
less | 一页一页显示文件内容,可以向上翻页 | P189 |
grep | 可以按关键字,检索stdin的行,当然也可以检索关键字 | P352 |
指令 | 描述 | 参考 |
---|---|---|
head | 取出前几行 | P190 |
tail | 取出尾几行 | P190 |
cut(管道命令) | 将整个stdin的每一行按某一个分割符,分成一段一段 | P352 |
grep(管道命令) | 可以按关键字,检索stdin的行,当然也可以检索关键字 | P352 |
sort(管道命令) | 对STDIN按行,按字段排序 | P353 |
wc(管道命令) | 获取STDIN中有多少字、多少行、多少字符 | P354 |
uniq(管道命令) | 不想要显示STDIN中重复的数据(常与sort搭配) | P353 |
tr(管道命令) | 删除或替换将STDIN的一段文字,小写转大写 | P355 |
col(管道命令) | 将STDIN的[Tab]转换成空格(cat -A可查看) | P355 |
join | 将两个文件中,分别某行某字段,若相等则合并两行 | P356 |
paste | 不比较,直接将对应行数据合并,以【tab】分隔 | P356 |
expand | 将[tab]按指定个数的空格替换 | P357 |
sed(管道命令) | 分析标准输入,以及可以将数据进行替换、删除、新增、选取特定行等功能 | P373 |
printf | 格式化输出数据 $()获取指令的stdout作为stdin,然后进行处理。 | P378 |
awk | 常常按字段处理输入,区别于sed与printf常以行处理, | P379 |
diff | 比较两个文件的差异,常用行为单位去比较 | P382 |
cmp | 比较两个文件的差异,常用字节单位去比较,常针对二进制文件 | P382 |
patch | 利用文件差异,对文件进行更新。 | P383 |
pr | 打印文件内容,可以设置文档表头、页码等等 | P38 |
指令 | 描述 | 参考 |
---|---|---|
umask | 文件默认权限 | P195 |
chattr | 修改文件隐藏属性,只能在部分文件系统上生效 | P196 |
lsattr | 显示文件隐藏属性 | P197 |
Set UID | s:执行者将具有该程序拥有者(user)的权限。(仅对二进制程序有效,仅在执行过程中有效) | P198 |
Set SGID | s:执行者将具有该程序用户组(group)的权限。(可对二进制程序有效,仅在执行过程中有效,对文件和目录有效) | P199 |
Sticky BIT | t:用户组或其他人仅能针对此目录下,自己建立的文件或目录进行删除、改名、移动等操作。(仅对目录有效) | P199 |
指令 | 描述 | 参考 |
---|---|---|
which | 找出指令名的完整文件名,即指令的文件在哪(仅PATH) | P201 |
type | 找出指令名的完整文件名(不仅PATH) | P201 |
whereis | 根据关键字查找完整文件名(仅针对几个特殊目录进行查询) | P202 |
locate | 根据关键字在数据库(/var/lib/mlocate)查找完整文件名(用updatedb手动更新) | P203 |
find | 根据关键字在整个磁盘中查找完整文件名(-exec与{}有特别效果) | P203 |
指令 | 描述 | 参考 |
---|---|---|
xfx_info | xfs文件系统信息 | P224 |
df | 列出此磁盘上文件系统针对整体磁盘的使用量 | P225 |
du | 查看文件系统的磁盘使用量(常用在查看目录所占用磁盘空间) | P226 |
ln | 设置硬链接与软链接 | P229 |
lsblk | 列出磁盘列表以及对应挂载点 | P232 |
blkid | 列出设备的UUID等参数以及文件系统 | P232 |
parted | 列出磁盘的分区表类型与分区信息(可以判断是GPT还是MBR) | P233 |
gdisk | GPT分区 | P233 |
fdisk | MBR分区 | P237 |
partprobe | 更新Linux内核的分区表信息 | P236 |
mkfs.xfs | 格式化分区为XFS文件系统 | P238 |
mkfs.ext4 | 格式化分区为ext4文件系统 | P240 |
mkfs | 格式化分区为其他文件系统 | P241 |
xfs_repair | 检验XFS文件系统 | P241 |
fsck.ext4 | 处理ext4文件系统 | P242 |
mount | 挂载文件系统 | P243 |
umount | 取消挂载文件系统 | P246 |
mknod | 设置设备代码(Major,Minor) | P247 |
xfs_admin | 修改XFS文件系统的UUID与Label name | P247 |
uuidgen | 生成新的UUID | P248 |
tune2fs | 修改ext4的label name 与UUID | P248 |
/etc/fstab | 可以通过修改/etc/fstab文件进行挂载 | P250 |
【loop】 | mount搭配loop,将文件挂载到文件上,可以将镜像文件挂载 | P251 |
free | 查看内存使用状态 | P253 |
mkswap | 将磁盘分区或目录创建成swap类型 | P254 |
swapon | 将建立成swap类型的分区,加载成内存交换分区(swapon -s看信息) | P254 |
swapoff | 关闭swap分区 | P255 |
parted | 分区,MBR,GPT都可以 | P256 |
指令 | 描述 | 参考 |
---|---|---|
gzip | 压缩成*.gz | P264 |
zcat | 读取gzip压缩后的文本文件 | P264 |
zmore | 读取gzip压缩后的文本文件 | P264 |
zless | 读取gzip压缩后的文本文件 | P264 |
egrep/zgrep | 在gzip压缩文本文件中查找数据 | P264 |
bzip2 | 压缩成*.bz2 | P265 |
bzcat | 读取bzip2压缩后的文本文件 | P265 |
bzmore | 读取bzip2压缩后的文本文件 | P265 |
bzless | 读取bzip2压缩后的文本文件 | P265 |
bzgrep | 在bzip2压缩文本文件中查找数据 | P265 |
xz | 压缩成*.xz | P265 |
bzcat | 读取xz压缩后的文本文件 | P265 |
bzmore | 读取xz压缩后的文本文件 | P265 |
bzless | 读取xz压缩后的文本文件 | P265 |
bzgrep | 在xz压缩文本文件中查找数据 | P265 |
tar | (利用上面压缩方式压缩并)打包文件*.tar(仅打包文件tar -cv -f file.tar称为tarfile;压缩并打包tar -jcv -f file.tar称为tarball) | P26 |
指令 | 描述 | 参考 |
---|---|---|
tar | (利用上面压缩方式压缩并)打包文件(仅打包文件tar -cv -f file.tar称为tarfile;压缩并打包tar -jcv -f file.tar称为tarball) | P266 |
xfsdump | 备份XFS文件系统*.dump | P272 |
xfsrestore | XFS文件系统还原 | P275 |
mkisofs | 将想要刻录到光盘的数据制作成镜像文件*.iso,也是相当于将一个文件格式化成镜像文件系统,需要挂载才能查看其内容。 | P278 |
isoinfo | 可以查看镜像文件的镜像信息,但是里面的具体内容只有挂载后可以查看 | P279 |
cdrecord | (旧版)将镜像文件刻录到光盘 | P280 |
wodim | (新版,链接cdrecord)将镜像文件刻录到光盘 | P281 |
dd | 将磁盘或文件内容if直接导出of到磁盘文件或备份文件*.back(几乎是直接读取扇区) | P282 |
cpio | 可以备份任何东西成*.cpio,包括设备文件,但因为不会主动找文件,所以必须要利用管道命令。 | P |
指令 | 描述 | 参考 |
---|---|---|
stty | 设置终端输入按键的意义 | P342 |
set | 设置整个命令输出/输入的环境(不仅是设置变量) | P343 |
通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的表达方式。
符号 | 描述 | 参考 |
---|---|---|
* | 代表[0到无穷个]任意的字符串,如usr/*,包括usr/bin,usr/sbin等 | P344 |
? | 代表[一定有一个]任意字符(/etc/????即/etc下名字刚好四个字符的文件) | P344 |
[] | 一定包含括号内的一个字符,如[abcd]一定有a、b、c、d中的一个,且只有一个 | P344 |
[-] | 短横左右两边及之间的所有值的其中一个,如,[0-9]代表0、1、2、...、9的其中一个值 | P344 |
[^] | 一定不包括括号内的一个字符,如,[^0-9]代表非0、1、2、...、9的一个字符 | P344 |
符号 | 描述 | 参考 |
---|---|---|
> | 标准输出 | P346 |
>>(追加) | 标准输出 | P346 |
2> | 标准错误输出 | P346 |
2>>(追加) | 标准错误输出 | P346 |
2>&1 | 标准输出与标准错误输出一起重定向到同一文件myfile 显示1> myfile 将标准输出重定向到myfile,然后2>将标准错误输出也沿着1>的通路导入到myfile | P346 |
&>(同上面意义,但格式不同) | 标准输出与标准错误输出一起重定向到同一文件myfile | P346 |
/dev/null | 这是一个黑洞文件,可以重定向到这个文件,那么这个流数据就会直接消失。
| P346 |
1>&2 | 将echo "error message"的错误信息导入黑洞文件(其实它没有错误信息,但这不重要),而stdin中是"error message"是正确信息,作为stdin将要被输入到屏幕,但是它被转到的2>,即作为错误信息转到黑洞文件。 | P348 |
< | 标准输入,将原本需要用键盘输入的数据,改由文件内容来替换。如,想要将~\\.bashrc中的内容输入到catfile,而不用打印到屏幕上。 原本cat 接受键盘输入的数据作为输入流,并将其重定向到catfile,但是此处有一个标准输入流取代了键盘输入,直接输入到catfile。 | P347 |
<<(stdin结束符) | cat接受键盘输入的数据作为stdin,并将其重定向到catfile,当stdin遇到"end"则结束输入。 | P347 |
tee(管道命令) | 双向重定向,前面的重定向,都是将标准输出流全部输出给文件或者全部输出给屏幕,而tee可以既输出给屏幕又输出给文件。 last信息既可以作为stdout转stdin被导入loginfile,但此时原本应该是完全导入loginfile,而没有stdout作为cut指令的stdin,但tee是双向重定向,可以做到。 双向重定向到loginfile与more的stdin输出到屏幕。 | P354 |
- | 在管道命令中作为stdin与stdout存在。有些文件的指令参数规则必须要有文件名,但是在管道前的指令要求必须要是输出到文件名。但是我并不想新建一个文件,然后再从这个文件中导出数据。于是就用[-]代替stdout与stdin。 将/home打包,数据放到stdout而不是文件中,经管道后传给后面,这样就跳过了一个很麻烦的步骤。 |
符号 | 描述 | 参考 |
---|---|---|
[:alnum:] | 代表英文大小写字符及数字,即0-9、A-Z、a-z | P365 |
[:alpha:] | 代表英文大小写字符,即A-Z、a-z | P365 |
[:blank:] | 代表空格键与[tab] | P365 |
[:cntrl:] | 代表键盘上面,控制按键,包括CR、LF、Tab、Del等 | P365 |
[:digit:] | 代表数字而已,即0-9 | P365 |
[:graph:] | 除了空格符(空格键与[Tab])外的其他所有按键 | P365 |
[:lower:] | 代表小写字符,即a-z | P365 |
[:print:] | 代表任何可以被打印出来的字符(不仅是键盘) | P365 |
[:punct:] | 代表标点符号(punctuation symbol),即:?#"'!;:$ | P365 |
[:upper:] | 代表大写字符,即A-Z | P365 |
[:space:] | 任何会产生空白的字符,包括空格键、[tab]、CR等 | P365 |
[:xdigit:] | 代表16进制的数字类型,包括0-9、A-F、a-f的数字与字符 | P365 |
[] | []其中一个字符,如[a-z] | P369 |
[^] | 非[]中字符,如,[^[:digit:]]非数字 | P369 |
^ | 开头,如,^[a-z]以小写字母开头,^[^a-z]以非小写字母开头 | P369 |
$ | 结尾,如,[a-z]$以小写字母结尾,以[^a-z]$以非小写结尾 | P369 |
^$ | 空行,不打印空白行grep -v '^$' | P369 |
.(这里有个点) | 一定有一个任意字符 | P370 |
* | 重复前一个字符,0到无穷多次,'.*'代表任意串;至少2个oo则是ooo*,有g与g包裹的任意串,g.*g(中间有个点) | P370 |
\\ | 转义特殊字符 | P372 |
\\{n,m\\} | 前一个字符连续n到m个都可以 | P372 |
\\{n\\} | 前一个字符连续n个 | P372 |
\\{n,\\} | 前一个字符连续n个及以上 | P372 |
+(扩展RE,用egrep) | 一个或一个以上前一个RE字符相当于\\{1,\\} | P376 |
?(扩展RE) | 零个或一个前一个RE字符 | P376 |
|(扩展RE) | 或,如'gd|good|dog' | P376 |
()(扩展RE) | 群组字符串,'g(ld|oo)d' | P377 |
()+(扩展RE) | 多个重复群组字符串'A(zyx)+B' |
以上是关于2021-07-03 SHELL 脚本常用的主要内容,如果未能解决你的问题,请参考以下文章