《Linux Shell 脚本攻略》阅读笔记

Linux Shell脚本攻略

豆瓣评分

8.1

内容简介

《Linux Shell 脚本攻略》通过细致剖析实际应用中的 110 多个案例,使许多看似复杂的 Linux shell 脚本任务迎刃而解。《Linux Shell 脚本攻略》会帮助读者利用少量命令的组合完成诸如文本处理、文件管理、备份等复杂的数据管理工作。它将告诉你如何利用 shell 命令快速开发常规任务,综合应用 grep、find、sed 和 awk 等常用命令,凭借短短几个命令行从 Web 挖掘数据的 shell 脚本,利用归档工具运行并自动化各种任务,诸如自动备份和存储;帮助你理解文件系统、文件类型以及文件管理;用 shell 创建以及维护文件或目录归档、压缩格式和加密技术;通过 srlell 脚本设置以太网和无线 LAN;使用登录技术监控网络上的各种动态。

[TOC]

其他

Z-Shell Frequently-Asked Questions

第 1 章 小试牛刀

1.2 终端打印

echo 双引号 中需要转移 单引号不用

printf 不会自己添加换行

printf “%-5s %-10s %-4s\n” No Name Mark

-5: 左对齐占 5 的长度

%s %c %n %f

echo -e “1\t2\t3” 用-e 不输出默认的换行

echo 还能输出彩色文本

1.3 玩转变量和环境变量

env 输出当前 shell 中全部的环境变量

怎么查看其它进程的环境变量?

1.通过 pgrep 获取 gedit 进程的 ID

pgrep gedit

2.cat /proc/$PID/environ

使用函数添加环境变量

1
2
prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }
prepend PATH /opt/myapp/bin

先检查第二个参数的目录是否存在,eval 表达式将第一个参数的变量值设置为 第二个参数加上 : ,再加上第一个参数的原始值

如果$1 为空,会多一个: , 书中还改进了,太复杂了,当场去世

1.4 通过 shell 进行数学运算

整数运算

let result=no1+no2

使用 let 不需要变量前添加 $

let no1++

let no1–

let no+=6

[] 的用法和 let 一样

result=$[ no1 + no2 ]

浮点数运算

1
result=`echo "$no * 1.5" | bc`

bc 还能设置浮点数的精度,支持进度转换

**1.5 玩转文件描述符和重定向

文件描述符 0 1 2

0: 输入 stdin

1: 输出 stdout

2: 错误 stderr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# > 等价于 1>
ls 1>stdout.txt 2>stderr.txt
# 将 stderr 转换成 stdout
ls > out.txt 2>&1
#
ls &> out.txt
# 可以追加到 /dev/null, 它会丢弃接收到的任何任何数据,null 也被称为黑洞

# 若既想输出到文件,又想再次使用输出,可以使用 tee
# tee 默认覆盖文件, tee -a 追加
cat a* | tee -a out.txt | cat -n

# tee - 可以将输出输出 2 次给 stdout 如:
# 我测试了下,并不行
# echo aaa | tee -
1
2
3
4
5
6
7
8
9
10
11
12
# <

# 文件重定向到命令
cmd < file

# 在脚本中,可以将多行文本输入到 log.txt 中
cat<<EOF>log.txt
sfsadfasdfas
asdfasd
EOF
# 一般是追加 >>
cat<<EOF>>log.txt

1.6 数组和关联数组

定义数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 等号周围不能有空格
arr=(1 2 3 4)
# 或者直接赋值
arr[0]=1 # 赋值失败,因为索引从 1 开始
arr[5]=5

echo ${arr[0]} # 失败,因为索引从 1 开始

# 输出数组所有的元素
echo ${arr[*]}
echo ${arr[@]}

# 打印数组长度
echo ${#arr[@]}
echo ${#arr[*]}
image-20201201011042251 image-20201201011810102

关联数组 (字典?)

1
2
3
4
5
6
7
8
9
10
11
# 声明为关联数组
declare -A d
# 添加元素
d=([k1]=v1 [k2]=v2)
# 这样添加更加方便
d[k3]=v3
# 读取元素
echo ${d[k3]}

# 获取数组的索引
echo ${!d[*]} # iterm 使用失败
image-20201201011042251 image-20201201011810102

1.7 使用别名

alias 输出所有的别名

1
alias rm='cp $@ ~/backup && rm $@'

\cmd 执行 alias 之前的命令

1.8 获取终端信息

tput stty 是两款终端处理工具

用tput 可以获取终端的行数和列数,终端名,移动光标,设置终端背景色等

用 stty 可以 实现输入密码时不显示输入内容

1
2
3
4
5
6
7
8
#!/bin/sh

echo -e "Enter password: "
# 禁止回显
stty -echo
read password
# 允许回显
stty echo

1.9 获取、设置日期和延时

1
2
3
4
5
6
7
8
9
10
11
12
# 日期及延时
date
date +"%T"
date +"%s"
# --date 指定日期输入,但是我使用一直不行
date --date "jan 20 2001" +"%s"
date --date "Jan 20 2001" +"%s"
date -date "Jan 20 2001" +"%s"
date -d "Jan 20 2001" +"%s"

# 记录程序运行时间
start=$(date +%s)

1.10 调试脚本

1
2
3
# 使用 -x 参数开启调试
bash -x 1.sh
# 或者再脚本中 set -x 打开调试 set +x 关闭调试
image-20201201211210147 image-20201201211508575

1.11 函数和参数

1
2
3
4
5
6
7
8
9
# 两种建立连续序列的方法
echo $(seq 0 19)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

# 数字和 .. 之间没有空格
for i in {1..10}
do
echo $i
done
1
2
3
4
5
6
7
8
9
10
11
12
# 函数定义
f(){

}
# 函数调用
f;
f arg1 arg2;

$0 脚本名称
$1 第一个参数
$@ 全部参数
$# 参数数量

1.12 读取命令序列输出

1
2
3
4
5
6
7
8
9
# 将命令的输出赋值给变量

# 1.子 shell 法
out=$(ls | cat -n)
echo $out

# 2.反引用法
out=`ls | cat -n`
echo $out

1.13 以不按回车键的方式读取字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 读取 2 个字符到 var 中
read -n 2 var
# 将你输入的每一行存入 array 数组中
read -a array

# 其他参数
-s 无回显 silent
-t timeout 超时
-p "sdfsd" 先显示提示信息
-d delim_char 指定定界符

# 如:
read -n 8 -t 10 -p "请在 10 秒内输入 8 个字符:" -s password
echo $password

# mac + zsh 上很多read 参数 都不能使用

持续运行命令直至成功

1
repeat ()  { while true; do $@ && return; sleep 10; done; }

zsh 又抽风了,函数定义必须添加 function, $@ 不知道怎么改

虽然书上说 while :; 比 while true; 快,但是 zsh 用不了 while :;

还不如我之前写的重试函数:

1
2
3
4
5
6
retry () {
while ! $1
do
sleep $2
done
}

image-20201201214117930

1.14 字段分隔符和迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++;
done;
IFS=oldIFS
echo "$user $shell"

1
2
3
4
5
6
7
8
9
10
# 遍历列表
for i in list;
do
commands;
done;

for i in {1..50} {a..z} {A..Z};
do
echo -n $i;
done;

最后那个%有点奇怪

image-20201201220322509

1.15 比较与测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# if
if condition;
then
command;
fi

if condition;
then
command;
else if condition; then
command;
fi

# 使用逻辑运算符可以让代码更简洁
[ condition ] && command;
[ condition ] || command;

# 算术比较
[ 1 -eq 2 ] # =
-ne ≠
-gt >
-lt <
-ge ≥
-le ≤

# 文件系统相关
[ -f var ] # 存在正常的文件或文件夹
-e 存在文件
-d 存在文件夹
-x 文件可执行
...

# 字符串比较
[[ s1 == s2 ]] # 也可以只使用 =
[[ s1 != s2 ]]
[[ s1 > s2 ]]
[[ s1 < s2 ]]
[[ -z s1 ]] # s1 是空串
[[ -n s1 ]] # s1 不是空串

第 2 章 命令之乐

2.1 简介

2.2 用 cat 进行拼接

2.2.1 预备知识
2.2.2 实战演练
2.2.3 工作原理
2.2.4 补充内容

2.3 录制与回放终端会话

2.3.1 预备知识
2.3.2 实战演练
2.3.3 工作原理

2.4 文件查找与文件列表

2.4.1 预备知识
2.4.2 实战演练
2.4.3 补充内容

2.5 玩转 xargs

2.5.1 预备知识
2.5.2 实战演练
2.5.3 工作原理
2.5.4 补充内容

2.6 用 tr 进行转换

2.6.1 预备知识
2.6.2 实战演练
2.6.3 工作原理
2.6.4 补充内容

2.7 校验和与核实

2.7.1 预备知识
2.7.2 实战演练
2.7.3 工作原理
2.7.4 补充内容

2.8 排序、单一与重复

2.8.1 预备知识
2.8.2 实战演练
2.8.3 工作原理
2.8.4 补充内容

2.9 临时文件命名与随机数

2.9.1 实战演练
2.9.2 工作原理

2.10 分割文件和数据

2.10.1 工作原理
2.10.2 补充内容

2.11 根据扩展名切分文件名

2.11.1 实战演练
2.11.2 工作原理

2.12 批量重命名和移动

2.12.1 预备知识
2.12.2 实战演练
2.12.3 工作原理

2.13 拼写检查与词典操作

2.13.1 实战演练
2.13.2 工作原理

2.14 交互输入自动化

2.14.1 预备知识
2.14.2 实战演练
2.14.3 工作原理
2.14.4 补充内容

第 3 章 以文件之名

3.1 简介

3.2 生成任意大小的文件

3.3 文本文件的交集与差集

3.3.1 预备知识
3.3.2 实战演练

3.4 查找并删除重复文件

3.4.1 预备知识
3.4.2 实战演练
3.4.3 工作原理
3.4.4 参考

3.5 创建长路径目录

3.5.1 预备知识
3.5.2 实战演练

3.6 文件权限、所有权和粘滞位

3.6.1 预备知识
3.6.2 实战演练
3.6.3 补充内容

3.7 创建不可修改文件

3.7.1 预备知识

3.7.2 实战演练

3.8 批量生成空白文件

3.8.1 预备知识
3.8.2 实战演练

3.9 查找符号链接及其指向目标

3.9.1 预备知识
3.9.2 实战演练

3.10 列举文件类型统计信息

3.10.1 预备知识
3.10.2 实战演练
3.10.3 工作原理

3.11 环回文件与挂载

3.11.1 预备知识
3.11.2 实战演练
3.11.3 补充内容

3.12 生成 ISO 文件及混合 ISO

3.12.1 预备知识
3.12.2 实战演练
3.12.3 补充内容

3.13 查找文件差异并进行修补

3.13.1 实战演练
3.13.2 补充内容

3.14 head 与 tail—— 打印文件的前 10 行和后 10 行

3.15 只列出目录的其他方法

3.15.1 预备知识
3.15.2 实战演练

3.16 在命令行中用 pushd 和 popd 快速定位

3.16.1 预备知识
3.16.2 实战演练
3.16.3 补充内容

3.17 统计文件的行数、单词数和字符数

3.17.1 预备知识

3.17.2 实战演练
3.17.3 补充知识

3.18 打印目录树

3.18.1 预备知识
3.18.2 实战演练
3.18.3 补充内容

第 4 章 让文本飞

4.1 简介
4.2 正则表达式入门
4.2.1 预备知识
4.2.2 实战演练
4.2.3 工作原理
4.2.4 补充内容
4.3 用 grep 在文件中搜索文本
4.3.1 预备知识
4.3.2 实战演练
4.3.3 补充内容
4.4 用 cut 按列切分文件
4.4.1 预备知识
4.4.2 实战演练
4.4.3 补充内容
4.5 统计特定文件中的词频
4.5.1 预备知识
4.5.2 实战演练
4.5.3 工作原理
4.5.4 参考
4.6 sed 入门
4.6.1 实战演练
4.6.2 补充内容
4.7 awk 入门
4.7.1 实战演练
4.7.2 工作原理
4.7.3 补充内容
4.8 替换文本或文件中的字符串
4.8.1 预备知识
4.8.2 实战演练
4.8.3 补充内容
4.8.4 参考
4.9 压缩或解压缩 JavaScript
4.9.1 预备知识
4.9.2 工作原理
4.9.3 工作原理
4.9.4 参考
4.10 对文件中的行、单词和字符进行迭代
4.10.1 预备知识
4.10.2 实战演练
4.10.3 工作原理
4.10.4 参考
4.11 按列合并文件
4.11.1 工作原理
4.11.2 参考
4.12 打印文件或行中的第 n 个单词或列
4.12.1 预备知识
4.12.2 实战演练
4.12.3 参考
4.13 打印不同行或样式之间的文本
4.13.1 预备知识
4.13.2 实战演练
4.13.3 参考
4.14 用脚本检验回文字符串
4.14.1 预备知识
4.14.2 工作原理
4.14.3 工作原理
4.14.4 补充内容
4.14.5 参考
4.15 以逆序形式打印行
4.15.1 预备知识
4.15.2 实战演练
4.15.3 工作原理
4.15.4 参考
4.16 解析文本中的电子邮件地址和 URL
4.16.1 预备知识
4.16.2 实战演练
4.16.3 工作原理
4.16.4 参考
4.17 打印文件中某个样式之前或之后的 n 行
4.17.1 预备知识
4.17.2 实战演练
4.17.3 参考
4.18 在文件中移除包含某个单词的句子
4.18.1 预备知识
4.18.2 实战演练
4.18.3 工作原理
4.18.4 参考
4.19 用 awk 实现 head、tail 和 tac
4.19.1 预备知识
4.19.2 实战演练
4.19.3 工作原理
4.19.4 参考
4.20 文本切片与参数操作
4.20.1 实战演练
4.20.2 参考

第 5 章 一团乱麻?没这回事

5.1 入门
5.2 网站下载
5.2.1 预备知识
5.2.2 实战演练
5.2.3 补充内容
5.3 以格式化纯文本形式下载网页
5.4 cURL 入门
5.4.1 预备知识
5.4.2 实战演练
5.4.3 补充内容
5.4.4 参考
5.5 从命令行访问 Gmail
5.5.1 实战演练
5.5.2 工作原理
5.5.3 参考
5.6 解析网站数据
5.6.1 实战演练
5.6.2 工作原理
5.6.3 参考
5.7 制作图片抓取器及下载工具
5.7.1 实战演练
5.7.2 工作原理
5.7.3 参考
5.8 网页相册生成器
5.8.1 预备知识
5.8.2 实战演练
5.8.3 工作原理
5.8.4 参考
5.9 Twitter 命令行客户端
5.9.1 预备知识
5.9.2 实战演练
5.9.3 工作原理
5.9.4 参考
5.10 基于 Web 后端的定义查询工具
5.10.1 预备知识
5.10.2 实战演练
5.10.3 工作原理
5.10.4 参考
5.11 查找网站中的无效链接
5.11.1 预备知识
5.11.2 实战演练
5.11.3 工作原理
5.11.4 参考
5.12 跟踪网站变更
5.12.1 预备知识
5.12.2 实战演练
5.12.3 工作原理
5.12.4 参考
5.13 以 POST 方式发送网页并读取响应
5.13.1 预备知识
5.13.2 实战演练
5.13.3 补充内容
5.13.4 参考

第 6 章 B 计划

6.1 简介
6.2 用 tar 归档
6.2.1 预备知识
6.2.2 实战演练
6.2.3 补充知识
6.2.4 参考
6.3 用 cpio 归档
6.4 用 gunzip 或 gzip 压缩
6.4.1 实战演练
6.4.2 补充内容
6.4.3 参考
6.5 用 bunzip 或 bzip 压缩
6.5.1 实战演练
6.5.2 补充内容
6.5.3 参考
6.6 用 lzma 压缩
6.6.1 实战演练
6.6.2 补充内容
6.6.3 参考
6.7 用 zip 归档和压缩
6.8 超高压缩率的 squashfs 文件系统
6.8.1 预备知识
6.8.2 实战演练
6.8.3 补充内容
6.9 加密工具与散列
6.10 用 raync 备份系统快照
6.10.1 实战演练
6.10.2 补充内容
6.11 用 Git 备份版本控制
6.11.1 预备知识
6.11.2 实战演练
6.12 用 dd 克隆磁盘
6.12.1 预备知识
6.12.2 实战演练
6.12.3 补充内容
6.12.4 参考

第 7 章 无网不利

7.1 简介
7.2 联网知识入门
7.2.1 新手上路
7.2.2 实战演练
7.2.3 补充内容
7.2.4 参考
7.3 使用 ping
7.3.1 实战演练
7.3.2 补充内容
7.4 列出网络上所有的活动主机
7.4.1 新手上路
7.4.2 实战演练
7.4.3 工作原理
7.4.4 补充内容
7.4.5 参考
7.5 传输文件
7.5.1 新手上路
7.5.2 实战演练
7.5.3 补充内容
7.5.4 参考
7.6 用脚本设置以太网与无线 LAN
7.6.1 新手上路
7.6.2 实战演练
7.6.3 工作原理
7.6.4 参考
7.7 用 SSH 实现无密码自动登录
7.8 用 SSH 在远程主机上运行命令
7.8.1 新手上路
7.8.2 实战演练
7.8.3 补充内容
7.8.4 参考
7.9 在本地挂载点上挂载远程驱动器
7.9.1 新手上路
7.9.2 实战演练
7.9.3 参考
7.10 在网络上发送多播式窗口消息
7.10.1 新手上路
7.10.2 实战演练
7.10.3 工作原理
7.10.4 参考
7.11 网络流量与端口分析
7.11.1 新手上路
7.11.2 实战演练
7.11.3 补充内容

第 8 章 当个好管家

8.1 简介
8.2 统计磁盘的使用情况
8.2.1 新手上路
8.2.2 实战演练
8.2.3 补充内容
8.3 计算命令执行时间
8.4 与当前登录用户、启动日志及启动故障的相关信息
8.4.1 新手上路
8.4.2 实战演练
8.5 打印出 10 条最常使用的命令
8.5.1 新手上路
8.5.2 实战演练
8.5.3 工作原理
8.6 列出 1 小时内占用 CPU 最多的 10 个进程
8.6.1 新手上路
8.6.2 实战演练
8.6.3 工作原理
8.6.4 参考
8.7 用 watch 监视命令输出
8.7.1 实战演练
8.7.2 补充内容
8.8 对文件及目录访问进行记录
8.8.1 新手上路
8.8.2 实战演练
8.8.3 工作原理
8.9 用 logrotate 管理日志文件
8.9.1 新手上路
8.9.2 实战演练
8.10 用 syslog 记录日志
8.10.1 新手上路
8.10.2 实战演练
8.10.3 参考
8.11 通过监视用户登录找出入侵者
8.11.1 新手上路
8.11.2 实战演练
8.11.3 工作原理
8.12 监视远程磁盘的健康情况
8.12.1 新手上路
8.12.2 实战演练
8.12.3 工作原理
8.12.4 参考
8.13 找出系统中用户的活动时段
8.13.1 新手上路
8.13.2 实战演练
8.13.3 工作原理

第 9 章 管理重任

9.1 简介
9.2 收集进程信息
9.2.1 新手上路
9.2.2 实战演练
9.2.3 补充内容
9.2.4 参考
9.3 杀死进程以及发送或响应信号
9.3.1 新手上路
9.3.2 实战演练
9.3.3 补充内容
9.4 which、whereis、file、whatis 与平均负载
9.5 向用户终端发送消息
9.5.1 新手上路
9.5.2 实战演练
9.5.3 工作原理
9.6 收集系统信息
9.7 用 /proc 收集信息
9.8 用 cron 进行调度
9.8.1 新手上路
9.8.2 实战演练
9.8.3 补充内容
9.9 从 Bash 中读写 MySQL 数据库
9.9.1 新手上路
9.9.2 实战演练
9.9.3 工作原理
9.10 用户管理脚本
9.10.1 实战演练
9.10.2 工作原理
9.11 图像文件的批量缩放及格式转换
9.11.1 新手上路
9.11.2 实战演练
9.11.3 工作原理
9.11.4 参考

# 推荐文章
  1.biweekly-contest-22
  2.面试题 01.07 旋转矩阵
  3.chrome 插件
  4.biweekly-contest-23
  5.weekly-contest-180

评论


:D 一言句子获取中...