读书笔记之:Linux命令行和shell脚本编程宝典
Linux命令行和shell脚本编程宝典
这次阅读《Linux命令行和shell脚本编程宝典》这本书是第3次阅读。 总的来说,这本书还是挺不错的。很适合入门。我也是从这本书开始了解shell编程的。
不过,因为现在对Linux 环境也比较熟悉了,并且也会一些shell编程了,所以,这次看的时候会比较快,有些已经会的东西就没有写。只是记录下那些之前没有注意到的东西。
第1章 Linux shell入门
Linux 内核
GNU软件:
Gnome shell
Gnome软件
Linux发行版
(1)核心发行版
(2)特定发行版
第2章 了解shell
Linux下的虚拟控制台:ctrl+Alt+F1/F2/F3../F8
模拟终端:xterm, gnome terminal
1. 任务管理命令:
&: 最经常被用到,这个用在一个命令的最后,可以把这个命令放到后台执行
ctrl + z:可以将一个正在前台执行的命令放到后台,并且暂停
jobs:查看当前有多少在后台运行的命令
fg:将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg:将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
(1). 文件列表
ls -l -h -a -s
(2). 创建文件/目录
touch -a access time
-m modify time
-t time stamp
mkdir -p
(3). 复制文件/目录
cp -r(递归复制文件) -v -p(保留文件属性)
-R(递归复制目录)
-l(创建硬链接文件)
-s(创建软连接)
(4). 重命名
mv -v
(5). 删除文件/目录
rm -r -v -f
rmdir
(6). 查看文件内容
cat -n(编号)
vi,od(二进制),more,less,tail,head
nl(为输出加上行号)
stat(文件统计数据)
file(文件类型)
3.进程管理
(1). 进程查看
ps -aux
ps -l
ps -efH
top
(2)进程管理
kill
(3) 查看磁盘
mount -o loop
umount
df -h -l
du -c -h -s -a
(4) 数据排序
sort -n(进行数值排序)
-r(逆序)
(5)搜索数据
grep -n(显示匹配行号)
-v(反转搜索)
-c(统计匹配数)
-e(指定多个匹配)
4. 环境变量
(1). 创建全局环境变量
export
(2). 移除全局环境变量
unset
(3). 默认的环境变量
HOME,HOSTNAME,PATH,IFS(用于分割字段的字符列表),OPTARG,OPTIND
(4). 登录shell
当登录到Linux系统时,bash shell将作为登录shell启动.登录shel将查找4个不同的启动文件来处理其中的命令.
bash shell中处理文件的顺序如下:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
即先执行/etc/profile,接着检查用户的目录中是否有.bash_profile,.bash_login或.profile其中之一.
当执行新的shell时, 如果是执行交互式的shell,例如直接执行bash,bash会执行/etc/bashrc文件,然后检查用户目录中的.bashrc
如果非交互式(shell script),bash shell会去执行BASH_ENV环境变量的内容.
5.shell中数学计算
(1)count=1;count=$[ $count+1 ]
(2) let i=i+1;(( i=i+1 ))
(3)var=1;var=`expr $var + 1`
第4章 Linux中的权限管理
常用的命令:
useradd用于添加新用户
userdel删除用户,但是只删除/etc/passwd中的用户信息,不会删除账户在系统中拥有的任何文件
passwd 修改账户密码
chsh 修改默认shell
groupadd 添加用户组
chmod 修改权限
chown 修改所有者
chgrp 修改用户组
第10章 结构化命令
(1) if-else
字符串比较:=,!=,<,>,-n,-z
文件比较:-e,-d,-f,-r,-w,-x,-s
复合条件检查:&&,||
(2)case
(3)for,while,until
(4)break,continue
第11章 处理用户输入输出
(1)命令行参数
basename,dirname
$#命令行参数个数
$*所有参数作为一个对象
$@所有参数作为多个对象
(2)处理选项
利用case语句的形式
getopt命令接受任意形式的命令选项和参数列表,并自动将这些选项和参数转换为适当的格式.
如:getopt ab:cd -a -b test1 -c -d test2 test3
set命令的一个选项是双破折号,将命令行参数变量替换为set命令的命令行中的值.
比如:set -- `getopt ab:cd -a -b test1 -c -d test2 test3`
getopts命令为在命令行中找到的所有待处理的选项和参数生成一个输出,并且顺序的对现有的shell参数变量进行处理
同时利用到了两个环境变量OPTARG和OPTIND.OPTARG中包含需要参数值的选项要使用的值;OPTIND包含的值表示getopts停止处理时在参数列表中的位置.
echo -n(不换行)
read 读取输入
-p 给出提示
-t 计时
-n1 指示read命令只需接受一个字符后就退出
-s 不回显
(4)使用临时文件
系统上的任何用户账户都有权读取和写入/tmp目录中的文件.
mktemp testing.XXXXXX 创建本地临时文件
-t 强迫mktemp在/tmp中创建文件
当mktemp创建临时文件时,它将完整路径名返回给环境变量.
-d 创建一个临时目录
输入输出重定向:
1.重定向错误
ls -al badfile 2>test4 #将错误重定向到文件test4,这样程序的错误就直接输入到了文件test4中,而在屏幕上看不到输出。
2. 重定向错误和数据
如果需要同时重定向错误和普通数据,则必须使用两个重定向符号。必须在希望重定向的数据前面放置相应的文件描述符,然后将他们指向相应的输出文件以保存数据
如:
ls -al test test3 badfile 2>test6 1>test7
这是将错误重定向到test6文件,将标准输出STDOUT重定向test7文件
其实,也可以将STDEER和STDOUT重定向到同一个文件,使用&>符号,如:
ls -al test test2 test3 badfile &> test7
这样,错误和标准输出都定向到test7文件中了。
3. 临时重定向
如:
echo "This is an error" >&2 #将这句重定向到了标准错误
4. 永久重定向
exec 1>testout 在脚本执行期间,将标准输出重定向到testout
exec 2>testerror 在脚本执行期间,将标准错误重定向到testerror
但是这样存在的一个问题是重定向STDOUT和STDERR之后,就无法再将他们重定向到原来的位置。
exec 0<testfile 在脚本执行期间,将testfile重定向到标准输入
5. 输出文件描述符。shell中最多有9个打开的文件描述符,其他6个是3~8
exec 3>test13out
echo "and this" >&3
将数字3重定向到test13out文件,这样上面echo后面的一句就输入到了test13out文件。
6. 恢复重定向文件描述符
exec 3>&1
exec 1>test14out
echo "dsafadsfasdf"
exec 1>&3
这样 先将文件描述符3重定向到标准输出,然后将标准输出重定向到文件test14out,之后再把文件描述符1重定向到3,这样1就恢复了原来的STDOUT了。这儿文件描述符3相当于一个临时变量来保存标准输出STDOUT
类似输入文件描述符如下:
exec 6<&0
exec 0<testfile
....
exec 0<&6
7. 创建读取/写入文件描述符
确实可以为输入和输出打开同一个文件描述符,可以使用同一个文件描述符从一个文件读取数据,同时向这个文件写入数据
exec 3<>testfile
输入输出都定向到了testfile文件。
8. 关闭文件描述符
要关闭文件描述符,将它重定向特殊符号&-
如:exec 3>&-
第13章 脚本 脚本控制
mktemp testint.XXXXXX 创建临时文件
-t 选项强迫mktemp在系统临时文件夹中创建临时文件
-d mktemp创建一个临时目录
tee命令可以将STDIN的数据同时发送到STDOUT和其所指定的文件
创建函数
return 命令以特定退出状态退出函数。return命令可以使用单个整数值来定义函数退出的状态,提供了一种通过编程设置函数退出状态的简单方法。
必须注意两个容易发生的错误:
(1)请记住在函数完成之后尽快提取返回值。
(2)请记住退出状态的取值范围是0~255
第15章 在脚本中使用颜色
第16章 sed和awk介绍
sed使用
-e 使用多个命令时要使用这个参数
-n 禁止输出
数字用来指定sed编辑器替换哪一个实例
p输出已经修改的行,-n 选项禁止sed编辑器的输出。二者结合使用会只输出那些已经更改行
删除文本d:指定行:sed '2,$d' data
模式指定:sed '/num/d' data#删除带有num的行
插入和附加文本:
插入命令(i)在指定行之前添加新一行
附加命令(a)在指定行之后添加一行
可以在i或a之前使用数字行号(包括某一个范围之内的所有行)或文本模式匹配(在所有的匹配行之后或之前插入),找到相应的行之后,再插入
更改行(c)和插入/附加的使用类似
变换命令y:[address]y/inchars/outchars/
将[address]范围之内的所有inchars字符替换为outchars,注意inchars与outchars的个数必须一致,从而保证一一映射。这是个全局命令
打印行号(=):sed '=' data1
将文件用于sed(可以使用地址范围和模式匹配)
1. 写文件
[address]w filename 如 sed -n '1,3w test' data6 将1到3行写入到test
2. 读文件
[address]r filename
将filename中的内容读入到r行之后,在标准输出上显示
正则表达式
^匹配开头
$匹配结尾
. 单个字符匹配
[]匹配字符类
[^]否定字符类
特殊字符类
gawk的使用
-F 指定分隔符
-v 定义所要使用的变量
$0:整行文本
$1,$2,...第1,2个字段
gawk ' BEGIN{} {} END{}'
字段匹配符号~
$1 ~ /^data/
如:gawk 'BEGIN {FS=","} $2 ~ /^data2/{print $0}' data1
使用数学表达式:
gawk -F: '$4 == 0{print $1}'/etc/passwd
数学比较式:==,<=,<,>=,>
结构化命令:(用花括号括起来)
if{}else{}
while{}
do{}while
for(){}
格式化打印:
printf "format string",var1,var2....
用户可以在脚本中定义变量
在gawk的脚本中进行变量赋值的方法类似于shell脚本
赋值语句中还可以包含数学计算,如:gawk 'BEGIN {x=4;x=x*2+3;print x}'
第19章高级gawk编程