第十章学习笔记

学习笔记

sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。其次,在C程序中,每个变量必须有一个类型,例如charintfloat、派生类型(如 struct)等。相反,在 sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。最后,每个c程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在 sh脚本中,第一个可执行语句是程序的入口点。

学习问题:大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?

根据定义可知,程序设计语言有3个方面的因素,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成语言的各个记号之间的组合规律,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但不涉及使用者。语言的种类千差万别。但是,一般说来,基本成分不外4种。数据成分、用以描述程序中所涉及的数据。运算成分、用以描述程序中所包含的运算。控制成分、用以表达程序中的控制构造、传输成分。这些要素具体体现在sh编程中的各类命令当中。

知识点总结

1、命名和语法格式:命名要有意义(30个字解决)、以.sh结尾
脚本格式:开头指针脚本运行环境,以#!组成(如#!/bin/bash),用于解释环境
注释:#,最好加入说明字段:Author,Created Time,Script Description—注释说明
2、特殊符号

~:家目录
!:执行历史命令
$:变量中取内容符
&:后台执行
;:一行执行多个命令,以此为间隔
|:管道符
``:反引号,命令中执行命令

3、管道
上一个命令的输出作为下一个命令的输入

4、shell重定向
<可用来作为命令的option项
<<重定向输出就是当执行文件的时候,有些参数 要我们输入,此时可用(交互)
格式化输出

5、echo
参数

n:不要自动换行
e:若出现某个字符。特殊处理
\a:发出警告声
\c:不换行
\n:换行且光标移动到行首
\t:插入tab
-help:显示版本信息

6、程序交互
read命令:默认接受键盘的输入,回车符代表输入结束

p:打印信息
t:打印时间(超时限制)
s:不回显
n:输入字符个数

7、变量
变量分类:
本地变量:用户私有变量,只有本用户可以用,保存在家目录下的.bash_profile,.bashrc文件中
全局变量,所有用户都可以使用,保存在etc下的.bash_profile,.bashrc文件中
用户自定义变量,脚本中的变量
变量定义:变量名=值
注意:命名只能用英文字母,数字或下划线,首个字符不能以数字开头
命名不能有空格,可以使用下划线
不能使用标点符号
不能使用bash里面的关键字

8、运算
数学比较运算

eq:等于(equal)
gt:大于(greater)
lt:小于(less)
ge:大于或等于(greater or equal)
le:小于或等于(less or equal)
ne:不等于(not equal)
文件运算

d:检查文件是否存在且为目录
e:检查文件是否存在
f:检查文件是否存在且为文件
r:文件是否可读
s:不为空
w:是否可写
x:可执行
O:是否被当前用户拥有
G:默认用户组为当前用户组
字符串比较运算

==:等于
!=:不等于
-n:字符串长度是否大于0
z:字符串长度是否为0
逻辑运算

&&
||

赋值运算

=

9、控制结构
有if选择、for、while、until循环等等,语句结构与C语言类似

最有收获的内容

最有收获的是关于sh编程语言和C语言体系的相互比较,这让我更加深入地了解了sh语言。例如在输入输出方面,有:
read 命令:read variable,从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。
echo 命令:输出。
显示命令执行结果:用反引号括起来。如 echo 反引号 某命令 反引号
printf 命令,格式化输出字符:与 C 语言相同。

问题和解决思路

在学习本章后对一些sh命令进行了模拟练习,运行了shell脚本,截图如下:

一个简单的打印程序,打印helloworld,sh脚本代码如下:

#!/bin/sh
a="hello world!"
num=2
echo "a is : $a num is : ${num}nd"

遇到的问题:一开始执行sh脚本时发现执行失败,查看原因得知是权限不允许执行sh脚本

解决思路:需要有权限命令来执行sh脚本,这里用的是chmod命令, chmod是权限管理命令change the permissions mode of a file的缩写。
u代表所有者,x代表执行权限。 + 表示增加权限。
chmod u+x file.sh 就表示对当前目录下的file.sh文件的所有者增加可执行权限。

这个sh脚本对if语句进行了练习,查看bash、shadow两个文件是否存在,若存在则打印相关的信息。

if [condition]
	then 
		commands
else
	commands
fi		# 结束

对于双分支的if语句,注意不要忘了结束语fi(finish)。
sh脚本的代码如下:

#!/bin/sh
If [ "$SHELL" = "/bin/bash" ];then
echo "your login shell is the bash \n"
echo "SHELL is : $SHELL"
else 
echo "your login shell is not bash but $SHELL"
fi
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
if [ -f "/etc/shadow" ];then
echo "电脑密码使用隐藏字符"
else
echo "并没有"
fi

遇到的问题:
一开始键入代码发现程序报错,查找原因发现是if和[]中的空格输入有误。
解决思路:应当将if和[]间的空格都打出来,才不会报错
遇到的问题2:
如何理解-f选项?

解决思路:
这些选项以及其它的选项释义可以通过查阅资料整理如下:

#[ -f "somefile" ] : 判断是否是一个文件
#[ -x "/bin/ls" ] : 判断/bin/ls是否存在并有可执行权限
#{ -n "$var" } : 判断$var变量是否有值
#[ "&a" = "$b" ] : 判断$a和$b是否相等
posted @ 2021-09-25 11:21  爱冒险的丁丁  阅读(33)  评论(0编辑  收藏  举报