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
特殊SHELL命令
指令描述参考
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
cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -n 1 id

通过-n说明,按1个一个赋予参数。常用于为非管道命令提供stdin使其可以使用标准输入。

P358
dmesg列出内核信息
sh开启子进程,运行shell脚本文件,运行结束后,子进程bash消失P392
test测试文件属性,并返回结果,常与&&和||结合在一起P396
变量运算
运算符描述参考
${var}取变量值P318
var=valuevar="myname is $uname" 设置变量值P319
echo "a=${num};4*a(1)" | bc -lq
将echo参数内容没有管道则导入到屏幕,如果有管道则传给管道后面作为其stdinP394
\\\\ 转义特殊变量值符号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=$var1P333
var2=${var1:-str}var1未设置或空串则var2=str,非空则var2=$var1P333
var2=${var1+str}var1未设置则var2=,设置则var2=strP333
var2=${var1:+str}var1未设置或空串则var2=,非空则var2=strP333
var2=${var1=str}var1未设置则var2=var1=str,设置则var2=$var1P333
var2=${var1:=str}var1未设置或空串则var2=var1=str,设置则var2=$var1P333
var2=${var1?str}var1未设置则str输出到stderr,设置则var2=$var1P333
var2=${var1:?str}var1未设置或空串则str输出到stderr,设置则var2=$var1P333
read读取来自键盘输入的变量P328
declare,typeset声明变量的类型P328
var[i]=value设置数组值,从1计数P329
declare -i result=${num1}*${num2}
两个变量${num1}和${num2}相乘(声明整型)P393
result=$((${num1}*${num2}))
两个变量${num1}和${num2}相乘(双层括号代表数值运算)P393
echo "123.123*55.9" | bc
用bc计算数值运算结果P393
sh运行bash文件*.sh,结束后,定义的变量被释放P395
source运行bash文件*.sh,结束后,定义的变量依然存在P395
$0表示第0个参数,即代表这个被执行的sh文件
$1        $2        $3        ....代表bash指令的第1、2、3个参数 param1 param1 param2
sh mytest.sh param1 param2 param3 param4 param5 param6
P399
$#代表bash指令参数个数(被执行文件后面的参数),$#是6P399
$@代表所有的变量,如"$1""$2""$3",但都是独立的。注意没有"$0"P399
$*代表所有的变量,如"$0c$1c$2c$3",是用分隔符c隔开的整体P399
shift

参数偏移(删除),不带参数表示偏移一个值,上面的例子中$#变成5,偏移的是$1,而不是$0

shift

偏移掉param1,加上选项-n后,又偏移3个,偏移掉param2 param3 param4,$#成为2

shift -n 3
P400
命令运算
运算符描述参考
$?上一条执行过的指令的返回值
[zyx_master@study bin]$ ??
bash: ??: 未找到命令...
[zyx_master@study bin]$ echo $?
127

上一条命令运行错误,返回值为127

P349
cmd1&&cmd2若cmd1正确,cmd2执行;cmd1错,则cmd2不执行。(与的意思)P349
cmd1||cmd2若cmd1正确,cmd2不执行;cmd2错,则cmd2执行(异或的意思)P349
test测试文件属性,或者判断整数之间以及字符串之间关系,常与上面逻辑运算结合P396
[]

判断符号,[]内每个组件都要有空格来隔开,变量最好用双引号括起来,常数用单或双引号括起来,作为一个个参数。

[ "$home" == ${MAIL} ]

在bash中两个等号与一个等号同意义,描述上双等号作判断好点。

read -p "pls input (Y/N)" yn
[ ${yn} == "Y" -o ${yn} == "y"] && echo "OK,continue" && exit 0
[ ${yn} == "N" -o ${yn} == "n"] && echo "Oh,interrupt" && exit 0

-o是或的意思。

P398

SHELL打印文档内容的命令
指令描述参考
cat (concatenate)由第一行显示文件内容P187
tac从最后一行显示文件内容文件内容P188
nl与cat相似,但偏向于针对行号处理P188
more一页一页显示文件内容,但不能对管道回翻P189
less一页一页显示文件内容,可以向上翻页P189
grep可以按关键字,检索stdin的行,当然也可以检索关键字P35

SHELL中可以检索文件字符串功能的指令

SHELL中可以检索文件字符串功能的指令
指令描述参考
more一页一页显示文件内容,但不能对管道回翻P189
less一页一页显示文件内容,可以向上翻页P189
grep可以按关键字,检索stdin的行,当然也可以检索关键字P352
SHELL中可以对把文本文档作STDIN进行处理的指令
指令描述参考
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格式化输出数据
printf '%s\\t %s\\t %s\\t %s\\t %s\\t \\n' $(cat printf.txt)

$()获取指令的stdout作为stdin,然后进行处理。

P378
awk

常常按字段处理输入,区别于sed与printf常以行处理,

last -n 5 | awk '{print $1 "\\t" $3}'
P379
diff比较两个文件的差异,常用行为单位去比较P382
cmp比较两个文件的差异,常用字节单位去比较,常针对二进制文件P382
patch利用文件差异,对文件进行更新。P383
pr打印文件内容,可以设置文档表头、页码等等P38
权限
指令描述参考
umask文件默认权限P195
chattr修改文件隐藏属性,只能在部分文件系统上生效P196
lsattr显示文件隐藏属性P197
Set UIDs:执行者将具有该程序拥有者(user)的权限。(仅对二进制程序有效,仅在执行过程中有效)P198
Set SGIDs:执行者将具有该程序用户组(group)的权限。(可对二进制程序有效,仅在执行过程中有效,对文件和目录有效)P199
Sticky BITt:用户组或其他人仅能针对此目录下,自己建立的文件或目录进行删除、改名、移动等操作。(仅对目录有效P199
文件检索
指令描述参考
which找出指令名的完整文件名,即指令的文件在哪(仅PATH)P201
type找出指令名的完整文件名(不仅PATH)P201
whereis根据关键字查找完整文件名(仅针对几个特殊目录进行查询)P202
locate根据关键字在数据库(/var/lib/mlocate)查找完整文件名(用updatedb手动更新)P203
find根据关键字在整个磁盘中查找完整文件名(-exec与{}有特别效果)P203
磁盘与文件系统相关指令
指令描述参考
xfx_infoxfs文件系统信息P224
df列出此磁盘上文件系统针对整体磁盘的使用量P225
du查看文件系统的磁盘使用量(常用在查看目录所占用磁盘空间)P226
ln设置硬链接与软链接P229
lsblk列出磁盘列表以及对应挂载点P232
blkid列出设备的UUID等参数以及文件系统P232
parted列出磁盘的分区表类型与分区信息(可以判断是GPT还是MBR)P233
gdiskGPT分区P233
fdiskMBR分区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 nameP247
uuidgen生成新的UUIDP248
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压缩成*.gzP264
zcat读取gzip压缩后的文本文件P264
zmore读取gzip压缩后的文本文件P264
zless读取gzip压缩后的文本文件P264
egrep/zgrep在gzip压缩文本文件中查找数据P264
bzip2压缩成*.bz2P265
bzcat读取bzip2压缩后的文本文件P265
bzmore读取bzip2压缩后的文本文件P265
bzless读取bzip2压缩后的文本文件P265
bzgrep在bzip2压缩文本文件中查找数据P265
xz压缩成*.xzP265
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文件系统*.dumpP272
xfsrestoreXFS文件系统还原P275
mkisofs将想要刻录到光盘的数据制作成镜像文件*.iso,也是相当于将一个文件格式化成镜像文件系统,需要挂载才能查看其内容。P278
isoinfo可以查看镜像文件的镜像信息,但是里面的具体内容只有挂载后可以查看P279
cdrecord(旧版)将镜像文件刻录到光盘P280
wodim(新版,链接cdrecord)将镜像文件刻录到光盘P281
dd将磁盘或文件内容if直接导出of到磁盘文件或备份文件*.back(几乎是直接读取扇区)P282
cpio

可以备份任何东西成*.cpio,包括设备文件,但因为不会主动找文件,所以必须要利用管道命令。

P
Linux系统环境相关指令
指令描述参考
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
数据流重定向
符号描述参考
>

标准输出

ll / > ~/rootfile
P346
>>(追加)标准输出P346
2>标准错误输出
find /home -name .bashrc 2> errorfile
P346
2>>(追加)标准错误输出P346
2>&1

标准输出与标准错误输出一起重定向到同一文件myfile

find / -name ./bashrc > myfile 2>&1 

显示1> myfile 将标准输出重定向到myfile,然后2>将标准错误输出也沿着1>的通路导入到myfile

P346

&>(同上面意义,但格式不同)

 标准输出与标准错误输出一起重定向到同一文件myfile

find / -name ./bashrc &> myfile
P346
/dev/null这是一个黑洞文件,可以重定向到这个文件,那么这个流数据就会直接消失。
find / -name ./bashrc &> /dev/null
P346
1>&2
echo "error message" 2> /dev/null 1>&2

将echo "error message"的错误信息导入黑洞文件(其实它没有错误信息,但这不重要),而stdin中是"error message"是正确信息,作为stdin将要被输入到屏幕,但是它被转到的2>,即作为错误信息转到黑洞文件。

P348
<标准输入,将原本需要用键盘输入的数据,改由文件内容来替换。如,想要将~\\.bashrc中的内容输入到catfile,而不用打印到屏幕上。
cat > catfile < ~/.bashrc

原本cat 接受键盘输入的数据作为输入流,并将其重定向到catfile,但是此处有一个标准输入流取代了键盘输入,直接输入到catfile。

P347
<<(stdin结束符)
cat > catfile << "end"

cat接受键盘输入的数据作为stdin,并将其重定向到catfile,当stdin遇到"end"则结束输入。

P347
tee(管道命令)双向重定向,前面的重定向,都是将标准输出流全部输出给文件或者全部输出给屏幕,而tee可以既输出给屏幕又输出给文件。
last | tee loginfile | cut -d ' ' -f1

last信息既可以作为stdout转stdin被导入loginfile,但此时原本应该是完全导入loginfile,而没有stdout作为cut指令的stdin,但tee是双向重定向,可以做到。

last | tee loginfile | more

双向重定向到loginfile与more的stdin输出到屏幕。

P354
-在管道命令中作为stdin与stdout存在。有些文件的指令参数规则必须要有文件名,但是在管道前的指令要求必须要是输出到文件名。但是我并不想新建一个文件,然后再从这个文件中导出数据。于是就用[-]代替stdout与stdin。
tar -cvf - /home | tar -xvf - -C /tmp/homeback

将/home打包,数据放到stdout而不是文件中,经管道后传给后面,这样就跳过了一个很麻烦的步骤。

正则表达式(常令alias grep='grep --color=auto' )
符号描述参考
[:alnum:]代表英文大小写字符及数字,即0-9、A-Z、a-zP365
[:alpha:]代表英文大小写字符,即A-Z、a-zP365
[:blank:]代表空格键与[tab]P365
[:cntrl:]代表键盘上面,控制按键,包括CR、LF、Tab、Del等P365
[:digit:]代表数字而已,即0-9P365
[:graph:]除了空格符(空格键与[Tab])外的其他所有按键P365
[:lower:]代表小写字符,即a-zP365
[:print:]代表任何可以被打印出来的字符(不仅是键盘)P365
[:punct:]代表标点符号(punctuation symbol),即:?#"'!;:$P365
[:upper:]代表大写字符,即A-ZP365
[: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 脚本常用的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

shell 脚本 片段

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

2021-07-03-power shell创建文件命令

nodejs常用代码片段

shell脚本引用expect