《Unix/Linux系统编程》第十章学习笔记
第10章 sh教程
1、sh脚本
sh脚本,即shell脚本。sh脚本像解释器一样,但它通常用于调用外部已编译的程序。然后,它会捕获输出结果、退出代码并根据情况进行处理。sh有很多不同的版本,所有sh脚本基本上都执行相同的任务,但它们的脚本在语法上略有不同。
2、sh脚本与C程序
sh脚本像解释器一样,但它通常用于调用外部已编译的程序。然后,它会捕获输出结果、退出代码并根据情况进行处理。如果是可执行命令且为内置命令,则会直接执行;否则,它会复制一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。
C程序则必须先进行编译链接。
sh脚本不需要类型,C需要。
sh脚本不需要main()函数,C需要。
sh脚本中,第一个可执行语句是程序的入口点。
3、命令行参数
$# = 命令行参数$1到$n的数量
$* = 所有命令行参数、包括$0
$S = 执行sh的进程PID
$? = 最后一个命令执行的退出状态(成功为0,不然为非0)
若要按原样使用$,必须带有单引号或反引号\
4、sh变量
sh变量不需要声明。所有sh变量值都是字符串。
5、sh中的引号
通常,\用于引用单个字符。单引号用于引用长字符串,单引号内没有替换。双引号用于保留双引号字符串中的空格,单子啊双引号内会发生替换。
6、sh命令
Bash Shell 内建命令
: 扩展参数列表,执行重定向操作.读取并执行指定文件中的命令(在当前 shell 环境中)
Alias 为指定命令定义一个别名
bg 将作业以后台模式运行
bind 将键盘序列绑定到一个
readline 函数或宏
break 退出
for、while、select 或 until 循环
builtin 执行指定的 shell内建命令
caller 返回活动子函数调用的上下文
cd 将当前目录切换为指定的目录
command 执行指定的命令,无需进行通常的 shell 查找
compgen 为指定单词生成可能的补全匹配
complete 显示指定的单词是如何补全的
compopt 修改指定单词的补全选项
continue 继续执行 for、while、select 或 until 循环的下一次迭代
declare 声明一个变量或变量类型。Dirs 显示当前存储目录的列表
disown 从进程作业表中刪除指定的作业
echo 将指定字符串输出到 STDOUTenable 启用或禁用指定的内建shell命令
eval 将指定的参数拼接成一个命令,然后执行该命令
exec 用指定命令替换 shell 进程
exit 强制 shell 以指定的退出状态码退出
export 设置子 shell 进程可用的变量
fc 从历史记录中选择命令列表
fg 将作业以前台模式运行
getopts 分析指定的位置参数
hash 查找并记住指定命令的全路径名
help 显示帮助文件
history 显示命令历史记录
jobs 列出活动作业
kill 向指定的进程 ID(PID) 发送一个系统信号
let 计算一个数学表达式中的每个参数
local 在函数中创建一个作用域受限的变量
logout 退出登录 shell
mapfile 从 STDIN 读取数据行,并将其加入索引数组
popd 从目录栈中删除记录
printf 使用格式化字符串显示文本
pushd 向目录栈添加一个目录
pwd 显示当前工作目录的路径名
read 从 STDIN 读取一行数据并将其赋给一个变量
readarray 从 STDIN 读取数据行并将其放入索引数组
readonly 从 STDIN 读取一行数据并将其赋给一个不可修改的变量
return 强制函数以某个值退出,这个值可以被调用脚本提取set设置并显示环境变量的值和 shell 属性
shift 将位置参数依次向下降一个位置
shopt 打开/关闭控制 shell 可选行为的变量值
source 读取并执行指定文件中的命令(在当前 shell 环境中)
suspend 暂停 Shell 的执行,直到收到一个 SIGCONT 信号
test 基于指定条件返回退出状态码 0 或 1
times 显示累计的用户和系统时间trap如果收到了指定的系统信号,执行指定的命令
type 显示指定的单词如果作为命令将会如何被解释
typeset 声明一个变量或变量类型
ulimit 为系统用户设置指定的资源的上限
umask 为新建的文件和目录设置默认权限
unalias 刪除指定的别名
unset 刪除指定的环境变量或 shell 属性
wait 等待指定的进程完成,并返回退出状态码
7、Linux命令
echo命令:将参数字符串作为行回显到stdout。通常将相邻的多个空格压缩成一个空格,除非有引号。
expr命令:将两个参数字符串转换为数字,进行(二进制)操作后再转回字符串
管道命令:sh脚本中经常使用管道作为过滤器
实用命令:
awk:数据处理程序
cmp:比较两个文件
comm:选择两个排序文件共有的行
grep:匹配一系列文件的模式
diff:找出两个文件的差异
join:通过使用相同的键来连接记录以比较两个文件
sed:流或行编辑命令
sort:排序或合并文件
tail:打印文件的最后n行
tr:一对一字符翻译
uniq:从文件中删除连续重复行
8、sh中的通配符
*:可扩展到当前目录中的所有文件。
file *:列出当前目录中所有文件的信息
ls *.c:列出当前目录中所有以.c结尾的文件
?:查询某文件名中的字符。
file ???:有3个字符的所有文件名
ls *.???:一个点号,后有两个字符的所有文件名
[]:查询文件名中一对[]中的字符。
file*[ab]*:包含字符a或b的左右文件名
ls*[xyz]*:列出包含x、y或z的文件名
ls*[a-m]*:列出包含a到m范围内字符的所有文件名
问题与解决
1、Shell语言的执行方式有哪些?
bash script-name 或者 sh script-name;
这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法。推荐使用这种方法。
path/script-name或者./script-name;
指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限改为可执行(即文件权限属性为x位)。具体方法为:chmod a+x script-name。然后通过执行脚本绝对路径或者相对路径就可以执行脚本了。
注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错。因此,推荐第一种 bashscript-name。
source script-name或者. script-name。
source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。这是和其他几种执行shell方式的最大不同。