Unix/Linux系统编程(sh编程)
一.关于sh脚本(参考链接:https://blog.csdn.net/johnWcheung/article/details/60572613)
1.shell脚本简介
Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。shell脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。
sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。
2.sh脚本语法
1 )开头
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
要使编写脚本可执行:
编译 chmod +x filename 这样才能用./filename 来运行
2 )注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
3 )变量
在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:
1 #!/bin/sh 2 #对变量赋值: 3 a="hello world" 4 # 现在打印变量a的内容: 5 echo "A is:" 6 echo $a 7 #有时候变量名很容易与其他文字混淆,比如: 8 num=2 9 echo "this is the $numnd" 10 /*这并不会打印出"this is the 2nd",而仅仅打印"this is the",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:*/ 11 num=2 12 echo "this is the ${num}nd" 13 这将打印: this is the 2nd
实例:打印“hello”字符串
二.sh命令(参考链接:https://blog.csdn.net/johnWcheung/article/details/60572613)
1.内置命令
sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。
.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:将位置参数
trap[arg][n]:接收到信号n后执行参数
umask[ddd]:将掩码设置为八进制数ddd的
wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
read命令:当sh执行read命令时,它会等待来自stdin的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。
2.Linux命令
sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。下文列出并解释了其中一些命令。
eho命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
实用命令:除了上面的 Linux命令之外,sh还用许多其他实用程序作为命令。其中包括除了上面的Linux命令之外,sh还用许多其他实用程序作为命令。其中包括:
awk:数据处理程序
cmp:比较两个文件
comm:选择两个排序文件共有的行
grep:匹配一系列文件的模式
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件
sed:流或行编辑命令
sort:排序或合并文件
tail:打印某个文件的最后n行
tr:一对一字符翻译
uniq:从文件中删除连续重复行
3.管道命令(参考链接:https://blog.csdn.net/BigTiger_world/article/details/120538107)
通过内容过滤将输出重定向到文件是我们平日里的基本任务之一。
除了文件输入重定向和输出重定向,Linux Shell 还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。
Linux 管道使用竖线“|”连接多个命令,这被称为管道符。
Linux 管道的具体语法格式如下:
cmd1 | cmd2
cmd1 | cmd2 [ | cmdN... ]
当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。
这里需要注意,cmd1 必须有正确输出,而 cmd2 必须可以处理 cmd1 的输出结果;而且 cmd2 只能处理 cmd1 的正确输出结果,不能处理 cmd1 的错误信息。cmd3也能够接收cmd2的正确输出,依次类推。
(使用管道命令在dev目录下寻找std开头的文件)
cmd1:ls -l /dev “必须有正确的输出”,输出就是ls命令输出到标准输出文件stdout,其实就是输出到屏幕。上面操作说明的“第一个命令向标准输出写入”正是这个意思。
cmd2: grep std 它从标准输入读出数据,进行字符串比对。也就是说,这个grep命令是从stdin读取的数据。上面操作说明的“而第二个命令是从标准输入读取”正是这个意思。
一般新手肯定有这个疑问,既然“ls -l /dev”向屏幕文件stdout发送数据,grep是如何从stdin得到这个数据的呢?其实,这正是管道操作“|”干的活,管道操作“|”将“cmd1:ls -l /dev”的向stdout发送的数据,转而写入stdin,故此,“cmd2: grep std” 才能正常接收到数据。
也就是说,管道操作“|”就是把左边命令的stdout数据,转而写到stdin,供右边的命令使用。
三.sh控制语句
1.if-else-fi语句
if-else-fi语句的语法是:
if [ condition ]
then
statements
else
statements
fi
每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行。
实例:使用read与if-else-fi语句判断输入字符串(该语句对于空格要求较为严苛)
实例:使用使用if-elif-else-fi复合语句,对输入“yes”、“no”和其他字符串输出不同命令(该语句对于空格要求较为严苛)
2.for语句
for VARIABLE in string1 string2....stringr
do
commands
done
在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。
3.while语句
while [ condition ]
do
commands
done
当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。
4.case语句
case $variable in
pattern1) command;;
pattern2) command;;
patternN) command;;
esac
四.I/O重定向
当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向有以下形式和含义:
>file: stdout转向文件,如果文件不存在 将会创建文件。
>>file: stdout追加到文件。
<file: 将文件用作stdin;文件必须存在并 具有r权限。
<<word: 从“here”文件中获取输人,直到只包含“word”的行。
五.sh函数
sh函数的定义为:
func()
{
#function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
在sh脚本中无法声明函数原型。
sh函数的调用方式与sh脚本文件的执行方式完全相同。
六.问题与解决思路
1、总结一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
要素:
(1)数据类型
(2)常量
(3)变量
(4)运算符
(5)表达式
(6)标识符
(7)关键字
(8)数组
(9)基本控制结构
(10)函数
(11)输入和输出
(12)解释器和编译器
技能:
(1)数据结构的分析和设计
(2)算法(即处理逻辑,微观层次)的分析和设计
(3)系统架构(即处理逻辑,宏观层次)的分析和设计
shell脚本:
(1)用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
(2)提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
2、脚本是什么意思?sh脚本与sh有什么区别?
根据百度百科的解释,脚本是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。 Shell是一种命令语言,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面。
3、内置命令和外部命令的区别?
内置命令就是Bash Shell 自带的命令,外部命名是 Linux 系统中的应用程序。
内置命令的执行效率和资源消耗都优于外部命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!