第十章学习笔记
1-2
Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
这两个部分首先介绍了sh脚本和不同版本的sh,并把sh脚本和C语言进行比较。不难发现,sh脚本是解释程序,它会逐行读取sh脚本并直接执行,而C语言恰恰相反,它必须先编译链接,再通过主sh的子进程运行文件。除此之外,sh脚本中每一个变量都是字符串且不需要main函数,而C语言必须要有一个main函数,其变量也必须要有一个类型。
10.3-10.8
这部分主要说明如何编写sh脚本,包括命令行参数、sh变量、引号、sh语句、常规命令以及命令语句。
3-8内置命令:
.file:读取并执行文件。
break [n]:从最近的第n个嵌套循环中退出。
cd [dirname]: 更换目录。
continue[n]:重启最近的第n个嵌套循环。
eval [arg...]:计算一次参数并让sh执行生成的命令。
exec [arg...]:通过这个sh执行命令,sh将会退出。
exit [n]:使sh退出,退出状态为n。
export [var…]:将变量导出到随后执行的命令.
read [var...]:从stdin 中读取一行并为变量赋值。
set [arg...]:在执行环境中设置变量。
shift:将位置参数$2 $3...重命名为 $1 $2...。
trap [arg] [n]:接收到信号n后执行参数。
umask [ddd]:将掩码设置为八进制数 ddd 的。
wait pid]: 等待进程 pid,如果没有给出pid,则等待所有活动子进程。Linux命令
echo命令:通常将相邻的多个空格压缩成一个空格,除非有引号
expr命令:可将字符串转换为数字,进行操作后再转回字符串
Linux命令:
echo命令:将参数字符串作为行回显到stdout。
expr命令:间接更改sh变量的值。
管道命令:作为过滤器。
实用命令:
axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后口行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。
9
这部分介绍了sh的控制语句及其用法,sh控制语句
sh支持多种控制语句,可类比C语言的语句。,包括if-else-fi、for、while、until-do、case以及continue和break语句。if-else-fi语句和C语言中的if-else语句类似,但需要一个fi作为结束语句。for、while、until-do语句也十分类似,但需要有do-done关键字
10-16
这部分主要是讲解如何编写sh函数以及如何使用参数调用sh函数。
虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo “some text”: 将文字内容打印在屏幕上
ls: 文件列表
wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
cp sourcefile destfile: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file: 删除文件
grep ‘pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’
file.txt
cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对file.txt文件中的行进行排序
uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
expr: 进行数学运算Example: add 2 and 3expr 2 “+” 3
find: 搜索文件比如:根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回
tux
dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
head file: 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.file
awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用“,”作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller,
17-18
这部分主要是sh脚本的应用
最有收获的内容
shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh则指明使用bash执行。
!bin/bash
ls -l
通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是为shell脚本加上可执行权限并执行,第二种是通过sh命令执行shell脚本,例如执行当前目录下的run.sh脚本,命令如下:
//为shell脚本直接加上可执行权限并执行
chmod 755 run.sh
./run.sh
//通过sh命令执行shell脚本
问题与解决思路
shell编程路径是对的,可是执行之后,并没有返回上一层
!/bin/bash
pwd
cd ..
pwd
解决方法:执行:bash ./test1.sh 后的过程 :
面解释器的代码已经替换了子进程,下来就是一一去处理文本中的命令。子进程再去fork(),让孙子进程去处理第一行的命令
将第一行命令作为参数传给解释器(当前的解释器就类似于"函数")