《linux命令行与shell脚本编程大全》读书笔记

提高键入效率的快捷键

  • ALT + Backspace - 删除前一个单词

  • Shift + Insert - 向终端内粘贴文本

  • ctrl + u,删除从光标处到开头的命令文本

  • ctrl+k,删除从光标到结尾处的命令文本

  • ctrl + a:光标移动到命令开头

  • ctrl + e:光标移动到命令结尾

  • alt + f:光标向前移动一个单词

  • alt + b:光标向前移动一个单词

  • ctrl +w:删除一个词(以空格隔开的)

必知必会的命令

  • find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
  • grep -o 只显示匹配项
  • find / -iname “.” | xargs grep -E “something”

后台运行

  • 在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。那假如说我们想要退出当前终端,但又想让程序在后台运行,该如何处理呢
    nohup ./test > myout.txt 2>&1 &

shell的变量都是字符串

  • 尽量用引号把字符串引起来,不然的话有时会出现莫名其妙的错误

  • 双引号引用变量,会保留换行符

切换用户执行命令

  • echo “pwd” | su - xxx -c “ls -l”

脚本参数

参数,可选必选,类型,取值范围,位置,描述

ssh

  • 借助ssh,我们可以在远程主机上执行命令并读取输出。
    ssh user@host “cmd && cmd”

  • 将数据重定向到远程shell命令的stdin
    echo “text” | ssh user@host “cat >list”
    ssh user@host “cat >list” < filename

  • ~/.ssh目录

  • ssh协议
    用于远程加密登录与远程操作。
    其中登录分为口令登录和公钥登录。公钥登录,用户将自己的公钥存储在远程主机上,远程主机在登录时能解密用户私钥加密的信息即可登录。
    ssh用于远程登录,加密口令登录(服务器的公钥加密,存在中间人攻击),公钥登录(用自己的私钥加密)

scp命令

  • -r 递归
  • -p 保留文件的权限和模式
  • sftp 运行在ssh连接之上,必须安装并运行OpenSSH服务器上,默认端口22

养成查阅手册(doc)的习惯

  • man
  • -help -h
  • bash手册
  • man command

增加环境变量的方法

shell_command = “env” # 输出shell当前的环境变量

subprocess.call(shell_command, shell=True) # 输出的环境变量里面 没有 LANG LC_ALL

os.putenv(“LANG”, “en_US.UTF-8”)
os.putenv(“LC_ALL”, “en_US.UTF-8”)

subprocess.call(shell_command, shell=True) # 输出的环境变量里面 包含了 LANG LC_ALL

证书

  • 生成数字签名公钥证书
    其实数字签名证书的本质就是服务端的公钥+CA私钥加密的Hash值。(CA私钥负责签名,CA公钥负责验证)

  • 服务器获取到这个已经含有数字签名并带有公钥的证书,将该证书发送给客户端。当客户端收到该公钥数字证书后,会验证其有效性。大部分客户端都会预装CA机构的公钥,也就是CA公钥。客户端使用CA公钥对数字证书上的签名进行验证,这个验证的过程就是使用CA公钥对CA私钥加密的内容进行解密,将解密后的内容与服务端的Public Key所生成的Hash值进行匹配,如果匹配成功,则说明该证书就是相应的服务端发过来的。否则就是非法的

  • 公钥私钥,公钥用来加密信息,私钥用来数字签名

条件判断

双方括号,与或,可以实现复杂的条件判断

重要的几个热键[Tab],[ctrl]-c, [ctrl]-d

  • [Tab]按键—具有『命令补全』和『档案补齐』的功能

  • [Ctrl]-c按键—让当前的程序『停掉』

  • [Ctrl]-d按键—通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit

取得路径的文件名与目录名:

basename,dirname(不一定是绝对路径)

Shebang

  • Shebang(脚本开头要有蛇棒)
    类 UNIX 系统支持 Shebang。Shebang 用于告诉 Shell 使用什么解释器来运行脚本。我们可以根据编写脚本使用的语言来设置 Shebang 行。

netstat

  • 网络相关的命令
    我们可能常常会遇到进程第一次启动后,再次启动会出现端口绑定失败的问题,我们可以通过netstat命令查看端口占用情况:

  • netstat -anp|grep 端口号

  • netstat -lntup:l:listening n:num t:tcp u:udp p:display PID/Program name for sockets

屏幕冻结

程序运行时,终端可能输出大量的日志,此时可以使用ctrl+s键,冻结屏幕,使得日志不再继续输出,而如果想要恢复,可使用ctrl+q退出冻结。

多条命令执行

  • 使用分号隔开可以执行多条命令, 虽然;可以分割多条命令,但是不会因为前一条命令失败,而导致后面的不会执行。
    例如:$ cd /temp/log/;rm -rf *

  • 使用&&分割多条命令,而且可以确保前一条命令执行成功,才会执行后面一条。
    例如:$ cd /temp/log/&&rm -rf *

显示行号

  • cat -n service.log | grep 1388

  • sed -n “29496,29516p” service.log

  • cat -n service.log | tail -n +29496 | head -n 20:从29496行开始检索,往前推20条

  • 其他命令
    cat service.log | grep 13 |more :将查询后的结果交由more输出
    cat service.log | wc -l

查进程的两个命令

  • ps -ef

  • ps aux;可以显示cpu,内存的使用情况

  • 上面两个命令都是列出所有的进程

  • ps命令:ps 只显示当前终端当前用户的进程

lsof

lsof -i 列出开放的端口以及服务信息
lsof -i:4000

Linux的通配符

文件扩展
文件扩展匹配:是指生成匹配指定通配符的文件或路径名的过程
linux 命令行,文件(目录)中的通配符,不能用于跨路径
与正则表达式的通配符不同,linux 命令行,文件中的通配符:花中问星{}[]?*

*:匹配任何字符和任何数目的字符

?:匹配单个任意字符,不包括空格

[ ]:匹配[ ]之内的任意一个字符

[! ]:匹配除了[! ]之外的任意一个字符,!表示非的意思

{…}:匹配{}中的任一个字符串,和[]的区别是[]中为可以为字符串

命令 ls /usr/bin/w* 的效果是 列出指定目录下的所有以w开头的文件或目录 ;

命令 ls /usr/bin/w?? 的效果是 列出指定目录下的以w开头名称长度为3的所有文件或目录 ;

命令 ls /usr/bin/[xyz]* 的效果是 列出指定目录下的文件名以x或y或z开头的所有文件或目录 ;

命令 ls /usr/bin/[!a-h]* 的效果是 列出指定目录下的文件名不以a到h区间字母开头的所有文件或目录

nohup

进程注销后继续运行进程:nohup 命令 [选项] [参数] [输出文件] &

进阶命令

  • 杀死进程:kill -9 pid

  • free:查看内存使用状况

  • top :查看实时刷新的系统进程信息

  • cut

  • tr

  • file 查看文件类型

  • sort默认按照字符的字典排序;- n 按照数字排序

  • ls命令 -a -l -F -d -R

  • sed执行多条命令

sed -i -e cmd -e cmd file
  • curl
  • wget
  • sed的s命令,substitute

命令列表:

一行运行多条命令,命令之间用;或者&& 分割

进程列表:

将命令列表用小括号括起来,进程列表会生成一个子进程执行进程列表

内建命令与外部命令

外部命令执行时会创建一个子进程,又称为文件系统命令

内建命令,是shell的一部分,不需要借助外部程序文件来执行,不会创建子进程

不可不知的知识点

  • linux通过发送信号进行进程间的通信

  • shell 通过path环境变量查找命令

  • 当用户登录终端的时候,通常会启动一个默认的交互式shell

  • 续航符:反斜线分行

  • Linux环境变量用分号分割:

  • 创建库,在多个脚本中使用同一段代码

  • shell分割命令的符号:分号,换行符

  • 终端是shell交互式工具

  • Bash会对双引号引用的变量求值,不对单引号求值

  • %s 格式替换符

  • UID为重要的环境变量,Root用户的UID为0,通过判断UID来确认当前用户是不是超级用户

  • stderr 标准错误

  • cmd &> output.txt

  • 通过管道将上一个命令的输出作为下一个命令的标准输入

  • < 操作符用于从文件中读取内容至stdin

  • 目录的末尾是否加斜线:对程序的影响

  • 变量切片

  • 延时: sleep 1

  • 如使用vmstat查看系统的整体性能,mpstat用于查看cpu的性能,pidstat用于查看进程的状态,iostat用于查看io的状态,free用于产看内存的状态,sar用于产看网络的状态等

编码时你要注意保护敏感信息

  • 不要把密码硬编码在脚本里,不要把密码硬编码在脚本里,不要把密码硬编码在脚本里。

  • 记录日志时不可包含密码

shell变量的作用域

  • shell中默认的变量作用域都是全局的

  • 因此,相比直接使用全局变量,我们最好使用local readonly这类的命令,其次我们可以使用declare来声明变量。这些方式都比使用全局方式定义要好。

函数返回值

在使用函数的时候一定要注意,shell中函数的返回值只能是整数,估计是因为一般情况下一个函数的返回值通常表示这个函数的运行状态,所以一般都是0或者是1就够了,因此就设计成了这样。不过,如果非得想传递字符串,也可以通过下面变通的方法

func(){ echo "abc" }
res=$(func)

命令替换

  • shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量

  • 命令替换允许你将shell命令的输出赋给变量

  • 警告: 命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。

  • 在命令行提示符下使用路径./运行命令的话,也会创建出子shell;

  • 如果你使用的是内建的shell命令,并不会涉及子shell。

  • 在命令行提示符下运行脚本时一定注意是否创建子shell

  • 命令替换:读取命令序列的输出,也称为子shell,子shell的命令对父shell无影响,如切换目录,执行环境变量等

  • 使用函数输出,脚本输出,命令替换,用echo函数显示计算结果

内联输入重定向

  • 这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。

  • 内联输入重定向符号是远小于号(<<)。除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。

command << marker
data
marker
  • 在命令行上使用内联输入重定向时,shell会用PS2环境变量中定义的次提示符,来提示输入数据。下面是它的使用情况。
$ wc << EOF
> test string
> EOF

退出状态码

  • $?代表 上一个命令或脚本的退出状态码,标识执行成功与否,0-255,0通常表示成功

  • 默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出

  • 你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一个退出状态码

算术运算

美元方括号进行算数运算,浮点数使用bc

total=$[  $1 * $2  ]

if command

条件表达式是命令,命令的退出状态码为0,执行对应的语句

if command1; then
  commands
fi

VS Code shell的插件

  • shellman插件,提示语法

  • shellformat格式化插件

test命令

  • bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令。
if [ condition ]; then
    commands
fi

方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错。

  • test命令可以判断三类条件:
    数值比较
    文件比较
    字符串比较
    str1 = str2 检查str1是否和str2相同
    str1 != str2 检查str1是否和str2不同
    str1 < str2 检查str1是否比str2小
    str1 > str2 检查str1是否比str2大
    -n str1 检查str1的长度是否非0
    -z str1 检查str1的长度是否为0

IFS

  • 特殊的环境变量IFS,叫作内部字段分隔符(internal field separator)。
  • for命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。
  • IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符:空格、制表符、换行符

命令行参数和选项

命令行参数(添加在命令后的数据)、命令行选项(可修改命令行为的单个字母)
可选参数改变程序的行为

  • 位置参数

  • bash shell会将一些称为位置参数(positional parameter)的特殊变量分配给输入到命令行中的所有参数。这也包括shell所执行的脚本名称。位置参数变量是标准的数字:$0是程序名,$1是第一个参数,$2是第二个参数,依次类推,直到第九个参数$9。

KISS原则

Unix的哲学的根本原则,简单原则,尽量用简单的方法解决问题。KISS

函数

  • 可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了。

  • 函数一结束就取返回值,退出状态码0~255

  • 将函数变量和脚本变量隔离开来,只共享需要共享的变量

数组

  • 数组是能够存储多个值的变量,把值放在小括号中,用空格隔开
  • 关联数组:散列表在shell中叫关联数组,declare -A hashmap

$@ 与 $*

$@ $* ,加上双引号时,才有区别。

命令的输入

输入通常是通过stdin或者参数传递给命令

要使用双引号把字符串

对于变量而言,双引号引用会保留换行符,不用双引号引用的话,换行符被替换为空格

查看环境变量

env 、set

read

  • read是一个重要的bash命令,用于从键盘或者标准输入中读取数据。
  • 包含read命令的while命令

xargs

xargs 将命令的输出作为下一个命令的参数,不带xargs的话,默认是作为标准输入的

tr命令

作用:转换、删除、压缩

cat text | tr ‘\t’ ’ ’

tr -d ‘0-9’ 删除自定字符集合

tr -s ’ ’ 压缩指定字符

选项 -c 使用集合的补集

cut命令

按列处理数据的小工具

通过定界符,来分割

切分指定的范围:提取每一行的前十个字符

检验和(checksum)

md5sum、shasum

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值