第三周Linux教材第十章学习笔记——sh编程

发布时间 2023-09-24 18:05:20作者: 20211115fyq

第十章——sh编程

sh脚本

1.sh脚本是一种为shell编写的脚本程序。这个程序用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。

第一行必须为 #!/bin/sh

2.命令行使用chmod +x  <filename>编译后才能用./filename来运行。

3.注释:以#开头的句子表示注释,直到这一行的结束。

sh脚本与C程序

1. sh 是一个解释程序,逐行读取 sh 脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么 sh 可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反, C 程序必须先编译链接到一个二进制可执行文件,然后通过主 sh 的子进程运行二进制可执行文件。

2.在 C 程序中,每个变量必须有一个类型,例如 char 、 int 、 float 、派生类型(如 struct )等。相反,在 sh 脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。

3.每个 c 程序必须有一个 main() 函数,每个函数必须定义一个返回值类型和参数(如有)。相反, sh 脚本不需要 main 函数。在 sh 脚本中,第一个可执行语句是程序的入口点。

4.平均每行脚本语言代码执行成百上千条机器指令,高级语言则大约为五条。其中的原因之一是脚本语言使用了解释器,更大的原因是脚本语言的操作更加强大。脚本语言的代码量和编程时间都少于高级语言。

命令行参数

Shell编程中的命令行参数(位置参数)与C程序中的main函数传参类似。这些位置参数用$N表示,N为正整数,表示命令行传入的第N个参数。N从0开始进行标记,与C语言中的数组表示的方式相同。例如,$1表示传递给脚本程序的第一个参数,并依此类推。$0表示程序本身的名字。

读取参数

 读取脚本名称

 读取参数个数

 读取参数列表的最后一个参数

 遍历参数列表

 检测参数

 移动参数

 sh变量

在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。

变量定义和赋值

在Shell脚本中,可以使用等号(=)来定义和赋值变量,例如:variable_name=value。变量名通常是字母、数字和下划线的组合,但不能以数字开头。

要赋值给一个变量,可以这样写:

变量类型

在Shell中,变量可以是全局变量或局部变量。全局变量在整个脚本中都可见,而局部变量只在定义它的函数或代码块中可见。

变量的引用

使用$符号来引用变量的值,例如:echo $variable_name。这将输出变量的值。

有时候变量名很容易与其他文字混淆,

如果num不加{ },系统编译时就会将$之后的内容认为是变量名,这样的变量根本不存在,所以无法打印:

 添加{ }后系统可编译出存在的变量num:

特殊变量

Shell中有一些特殊变量,如$0表示脚本名称,$1$2等表示脚本的参数,$#表示参数的数量,$?表示上一个命令的退出状态等。

环境变量

环境变量是一种全局变量,用于存储操作系统和Shell的配置信息。一些常见的环境变量包括PATH(指定可执行文件的搜索路径)、HOME(指定当前用户的主目录)、USER(表示当前用户名)等。

变量的操作和修改

可以使用各种命令和操作符来修改和操作变量的值,如let命令、expr命令、+=操作符等。

删除变量

使用unset命令可以删除一个变量,例如:unset variable_name

以上程序执行后无输出:

变量的作用域

 变量的作用域决定了变量在何处可见。全局变量在整个脚本中可见,而局部变量只在定义它的函数或代码块中可见。

sh中的引号

sh 有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。例如:
A = xyz
echo  \$A          ==>$A      #原封不动地回报$
echo  '$A'         ==>$A      #在单引号中不进行替换
echo "see $A"  ==> see xyz     #在双引号中替换$A
通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

 

 sh命令

内置命令

shell有很多内置在其源代码中的命令。这些命令是内置的,所以shell不必到磁盘上搜索它们,执行速度因此加快。

内置sh命令表可查看此网址:https://blog.csdn.net/imxiangzi/article/details/50373541

Linux命令

1.echo命令

echo 只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。

2.expr命令

 运行结果报错:

 将乘法一行删除后可运行,向ChatGpt请教后发现乘号*前要加转移符 \  :

 程序修改后运行成功:

 

总结:expr除了可用于数学运算外,还可以用于字符串操作、逻辑运算、比较大小等。在使用 expr 进行数学运算和逻辑运算时,需要使用反斜杠(\)转义特殊字符,如 & 和 |。字符串操作中,要注意将字符串用双引号括起来,以处理包含空格或特殊字符的字符串。

另外,虽然 expr 在Shell脚本中是一个有用的工具,但它有一些限制,例如不支持浮点数运算,而且在复杂的数学和字符串操作中可能不够灵活。在现代Shell脚本编程中,通常使用更强大的数学和字符串操作工具,如 $((...)) 或 ((...)) 进行数学运算,以及 ${variable##pattern} 和 ${variable%%pattern} 进行字符串操作。这些工具更加直观且功能更强大。

 
3.管道命令

在sh脚本中经常使用管道作为过滤器。

书中介绍不详细,向ChatGpt请教:

 

 总结:将 | 前函数的输出作为 | 后函数的输入。

 

4.实用命令

 除了上面的 Linux 命令之外, sh 还使用许多其他实用程序作为命令。其中包括:

awk :数据处理程序。
cmp :比较两个文件。
comm :选择两个排序文件共有的行。
grep :匹配一系列文件的模式。
diff :找出两个文件的差异。
join :通过使用相同的键来连接记录以比较两个文件。
sed :流或行编辑命令。
sort :排序或合并文件。
tail :打印某个文件的最后 n 行。
tr :一对一字符翻译。
uniq :从文件中删除连续重复行。

命令替换

在 sh 中,$ A 会被替换成 A 值。同样,当 sh 遇到' cmd '(用引号括起来)或 S ( cmd )时,它会先执行 cmd ,然后用执行的结果字符串替换$( cmd )。

sh控制语句

sh是一种编程语言,支持许多执行控制语句,类似于C语言中的语句。

if-else-fi语句

  • 在条件判断中,变量通常需要用双引号括起来,以处理可能包含空格或特殊字符的情况。
  • fi 表示结束 if 块,它是 if 的倒写,用于标识条件判断的结束。
#①条件判断
if
[condition] then #条件为真时执行的语句; else #条件为假时执行的语句; fi
#②多重条件
if [condition1]
then
#条件1为真时执行的语句;
elif [condition2]
#条件2为真时执行的语句;
else
#所有条件都不满足时执行的语句;
fi
#③条件表达式
#
条件通常使用方括号 [ ] 来包含条件表达式。条件表达式可以包括比较操作符(如 -eq-ne-lt-gt 等)和逻辑操作符(如 &&||)。
if [ "num1" -ne "num2" ]; #注意:比较字符串用==或!=
then echo "num1 不等于 num2"
if [ "num1" -eq "num2" ];
then echo "num1 等于 num2"
if [ "num1" -gt "num2" ];
then echo "num1 大于 num2"
if [ "num1" -lt "num2" ];
then echo "num1 小于 num2"

for语句

for var in item1 item2  ... itemN
   do
       commands
done

写成一行:for var in item1 item2 ... itemN; do command1; command2… done;

while语句

while condition
do
     command
done

until-do语句

until [condition]
do
    #循环体
done

case语句

casein
模式1)
         command1
         command2
          ...
         commandN
         ;;
模式2)
         command1
         command2
          ...
         commandN
         ;;
esac

 sh函数

--------方法①--------
function  函数名
{
           #函数代码
}
--------方法②--------
函数名()
{
           #函数代码
}

sh脚本中的相关命令字符:

 向ChatGpt请求苏格拉底式提问

学习总结

学习本章内容时较为轻松,相较于C语言编程,shell 编程更为简洁易懂。