第十章 sh编程
10.1 sh脚本
1.可执行性:Shell 脚本需要设置可执行权限,使用 chmod +x script.sh 命令添加执行权限,然后可以通过 ./script.sh 执行脚本。
2.解释器指定:在脚本的第一行使用 #!/bin/sh 或 #!/bin/bash 来指定解释器。sh 是 Bourne Shell 的标准解释器,而 bash 是 Bourne Again Shell 的增强版。
3.变量和赋值:Shell 脚本中可以使用变量来存储和操作数据。变量赋值时,不需要显式声明类型,并使用 $ 前缀引用变量。例如:name="John" 和 echo $name。
4.命令执行:Shell 脚本可以执行命令并获取其输出结果,使用反引号 `` 或 $() 进行命令替换。例如:date、result=$(ls)。
5.条件判断:Shell 脚本可以使用条件语句进行逻辑判断。常用的条件语句包括 if、elif、else。
6.循环结构:Shell 脚本支持多种循环结构,如 for、while 和 until。
7.输入输出重定向:Shell 脚本可以通过输入输出重定向来处理标准输入、输出和错误输出。使用 <、>、>> 符号来指定重定向的方式。
10.2 sh脚本与C程序
sh脚本与C语言有一些相似之处,但它们在根本上是不同的。主要可以以它们的语法形式和用法
1.结构:Shell 脚本是一系列命令的集合,以文本形式存储在文件中。它们按顺序执行,逐行解释。C 程序则是通过编译器将源代码转换为可执行二进制文件,该文件包含了程序的指令和数据。
2.语法:Shell 脚本是一种解释型脚本语言,使用简单的语法和命令来控制系统的操作。它通常用于自动化任务、批处理和系统脚本等。C 语言是一种编译型语言,使用复杂的语法和控制结构来编写高效的系统软件和应用程序。
10.3 命令行参数
1.对于 Shell 脚本:
在脚本中,可以使用特殊变量 $0 来获取脚本名,$1、$2、$3 等依次表示第一个、第二个、第三个参数,以此类推。
使用 $# 可以获取传递给脚本的参数个数。
如果参数中包含空格或特殊字符,需要使用引号来引用参数。例如:./script.sh "Hello, World!".
2.对于 C 程序:
在 main 函数的参数列表中,argc 表示参数个数,argv 是一个指针数组,每个元素指向具体的参数字符串。
argv[0] 表示程序的名称,argv[1]、argv[2]、argv[3] 等表示具体的命令行参数。
通过遍历 argc 和 argv 数组,可以获取和处理命令行参数的值。
10.4 sh变量
内置变量
PATH
HOME
TERM
10.5 sh中的引导
引导通常以 #! 开头,后面跟着解释器的路径和参数。
bash:#!/bin/bash
sh:#!/bin/sh 或 #!/usr/bin/env sh
zsh:#!/bin/zsh
csh:#!/bin/csh 或 #!/bin/tcsh
设置了引导后,在执行脚本时,操作系统会根据引导找到对应的解释器,然后使用解释器来解释和执行脚本中的命令。
引导还可以带有参数,用于在执行脚本时传递一些额外的选项或参数给解释器。例如,如果在使用 bash 解释器执行脚本时需要使用 POSIX 模式,则可以将引导设置为 #!/bin/bash --posix。
10.6 sh语句
sh语句包括所有Unix/Linux命令,以及可能的I/O重定向
10.7 sh命令
1.内置命令、
.file:读取并执行文件
break [n]:从最近的第n个嵌套循环中退出
cd [dirname]:更换目录
continue [n]:重启最近的第n个嵌套循环
eval [arg...]:计算一次参数并让sh执行生成的命令。
exec [arg...]:通过这个sh执行命令,sh将会退出。
exit [n]:使sh退出,退出状态为n。
export [var…]:将变量导出到随后执行的命令.
trap [arg] [n]:接收到信号n后执行参数。
umask [ddd]:将掩码设置为八进制数 ddd 的。
wait pid]: 等待进程 pid,如果没有给出pid,则等待所有活动子进程。
read命令:当sh执行read命令时,它会等待来自stdin的输入行。
2.Linux命令
echo命令:用于在控制台输出文本或变量值。
expr命令:是一个用于数值表达式求值的实用工具
管道命令:在sh脚本中经常使用管道作为过滤器
ps -ax | grep httpd
cat file | grep word
实用命令:
axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后口行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。
10.8 命令替换
命令替换可以非常方便地实现一些复杂的功能和操作,如动态获取参数或配置信息、生成文件名称
10.9 sh控制语句
1.if-else-fi语句
2.for语句
3.while语句
4.until-do语句
5.case语句
6.continue和break语句
10.10 I/O重定向
I/O 重定向是 Shell 中常用的一种技术,它允许将命令的输入和输出重定向到文件或其他设备上。I/O 重定向使用特殊的符号来指示输入和输出的来源/去向。
10.11 嵌入文档
在一个文档中插入另一个文档或文件的内容。
HTML 中的 iframe 标签
Word 中的插入对象功能
LaTeX 中的 includegraphics 命令
Python 中的 import 语句
10.12 sh函数
sh函数定义:
func()
{
# function code
}
10.13 sh中的通配符
通配符是一种特殊字符模式匹配的功能,用于匹配文件名或路径名。
星号(*):匹配任意长度的任意字符(包括空字符)。例如:
.txt:匹配所有以 .txt 结尾的文件。
file:匹配所有以 file 开头的文件名。
问号(?):匹配单个任意字符。例如:
file?.txt:匹配类似 file1.txt、fileA.txt 等文件名。
方括号([]):匹配方括号中列出的字符之一。可以使用连字符(-)表示连续字符范围。例如:
[abc]:匹配 a、b 或 c 字符。
[0-9]:匹配任意一个数字字符。
10.14 命令分组
使用{}或()对命令进行分组
10.15 eval语句
eval函数会将字符串参数解析为有效的表达式,并返回表达式的结果。
在许多编程语言中,eval函数通常被用于动态执行代码,使程序能够在运行时根据需要生成和执行代码。
问题与解决思路
内置命令与Linux命令
苏格拉底挑战