《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方式的最大不同。

 

posted @ 2021-09-25 23:54  20191309刘嘉祺  阅读(50)  评论(0编辑  收藏  举报