20211314王艺达学习笔记3

发布时间 2023-09-24 21:48:01作者: 20211314王艺达

sh编程

sh脚本与C程序

·C程序必须先编译链接到一个二进制可执行文件,再通过主sh的子进程运行该二进制可执行文件;sh则可直接执行行命令。
·sh脚本不需要main函数。

编写sh脚本

shell的基本语法主要就是如何输入命令运行程序以及如何在程序之间通过shell的一些参数提供便利手段来进行通讯。

1.sh变量

(1)sh定义的环境变量

sh在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的sh环境变量有:

HOME:用于保存注册目录的完全路径名。
PATH:用于保存用冒号分隔的目录路径名,sh将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM:终端的类型。
UID:当前用户的标识符,取值是由数字构成的字符串。
PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1:主提示符,在特权用户下,缺省的主提示符是“#”,在普通用户下,缺省的主提示符是“$”。
PS2:在sh接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时sh判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是“>”。

(2)用户定义的变量

用户可以按照下面的语法规则定义自己的变量: 变量名=变量值
要注意的一点是,在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”;
在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来。 在编写sh程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。 有时我们想要在说明一个变量并对它设定为一个特定值后就不在改变它的值,这可以用下面的命令来保证一个变量的只读性:
readly 变量名
在任何时候,建立的变量都只是当前sh的局部变量,所以不能被sh运行的其他命令或sh程序所利用,export命令可以将一局部变量提供给sh执行的其他命令使用,其格式为:
export 变量名
也可以在给变量赋值的同时使用export命令: export 变量名=变量值
使用export说明的变量,在sh以后运行的所有命令或程序中都可以访问到。

2.参数置换的变量

sh提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下:

(1)变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
(2)变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在sh程序中不能为位置参数赋值。
(3)变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从sh中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
(4)变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。 所有这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。

sh控制语句

1.test测试命令

test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:

(1)数值测试:

-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真

(2)字符串测试:

=:等于则为真
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真

(3)文件测试:

-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。 同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2 var2=$[var1*10+1] 则:var2的值为21。

2.if条件语句

sh程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if 条件命令串 then
条件为真时的命令串
else
条件为假时的命令串
fi

3.for 循环

for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for 变量名 [in 数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。

4.while和until 循环

while 和 until命令都是用命令的返回状态值来控制循环的。
While 循环的一般格式为:
while
若干个命令行1
do 若干个命令行2
done
只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。
until命令是另一种循环结构,它和while命令相似,其格式如下:
until 若干个命令行1
do
若干个命令行2
done
until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
sh还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非0

5.case 条件选择

if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下:
case string in
exp-1) 若干个命令行1 ;;
exp-2) 若干个命令行2 ;;

sh通过计算字符串string的值,将其结果依次和表达式exp-1、exp-2等进行比较,直到找到一个匹配的表达式为止,如果找到了匹配项则执行它下面的命令直到遇到一对分号(;;)为止。
在case表达式中也可以使用shell的通配符(“”、“?”、“[ ]”)。通常用“”作为case命令的最后表达式以便使在前面找不到任何相应的匹配项时执行“其他命令行”的命令。

sh命令

sh函数

sh函数的定义为

sh中的通配符

星号通配符*:扩展到当前目录下的所有文件
?通配符?:查询某文件名中的字符
[]通配符:查询文件名中一对[]中的字符

程序设计语言的学习

一门程序设计语言通常包括以下几个必备要素和技能:

  1. 语法规则(Syntax):这是定义了语言的基本结构和规则,包括关键字、操作符、数据类型等等。

  2. 变量和数据类型:用于存储和操作数据的基本单元。这可能包括整数、浮点数、字符串等。

  3. 控制结构:这包括条件语句(如if-else)、循环语句(如for、while)、以及分支语句(如switch)等,用于控制程序的流程。

  4. 函数和模块:用于将代码模块化,提高代码的可读性和复用性。

  5. 数据结构:如数组、列表、字典等,用于组织和管理数据。

  6. 输入/输出:处理程序与外部环境之间的数据交换,如从键盘输入,向屏幕输出等。

  7. 异常处理:处理程序中可能出现的错误或异常情况。

  8. 面向对象编程(如果适用):包括类、对象、继承、多态等概念。

在Shell脚本中,这些要素和技能通常会以不同的方式呈现:

  1. 语法规则:Shell脚本也有自己的语法规则,包括各种命令、变量的引用方式等。

  2. 变量和数据类型:在Shell脚本中,变量的定义和使用相对简单,可以直接使用等号(=)来赋值。

  3. 控制结构:Shell脚本也支持条件语句(if-else)、循环语句(如for、while)等,虽然语法与一般的编程语言略有不同。

  4. 函数和模块:Shell脚本可以定义函数,以便将一系列操作封装起来,实现代码的模块化。

  5. 数据结构:相对于传统编程语言,Shell脚本的数据结构相对简单,通常以数组为主。

  6. 输入/输出:Shell脚本可以通过读取命令行参数或者从文件中读取数据,同时也可以将结果输出到屏幕或者文件中。

  7. 异常处理:Shell脚本可以通过条件判断和错误处理来应对异常情况。

  8. 面向对象编程:Shell脚本不是一个面向对象的语言,因此不包括类、对象等概念。

学习自测