信息安全系统实现与设计第三周——《Unix/Linux系统编程》第十章自学
第十章 sh编程
这一章详细介绍了sh脚本,包括如何编写、sh脚本的具体内容,各种语句的用法及示例还有sh脚本的广泛应用。
10.1 sh脚本
sh 脚本(Bourne 1982;Forouzan和 Gilberg 2003)是一个包含 sh语句的文本文件,命令解释程序sh要执行该语句。
举例:创建一个文本文件 mysh,包含∶
#! /bin/bash 
# comment line 
echo hello
使用 chmod +x mysh 使其可执行。然后运行 mysh。sh脚本的第一行通常以#!组合开始,通常称为 shebang。当主 sh 见到 shebang 时,会读取脚本所针对的程序名并调用该程序。


10.2 sh脚本与C程序
两者虽然部分相似,但根本上是不同的
1.sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行,而c程序必须先编译链接到一个二进制可执行文件,然后在通过主sh的子进程运行二进制可执行文件;
2.sh脚本的每个变量都是字符串,因此不需要变量,而c程序中每个变量都必须有一个类型,包括char、int、float等等;
3.sh脚本不需要main函数,第一个可执行语句是程序的入口,而c程序必须有main()函数。
10.3命令行参数
$#=命令行参数S1到Sn 的数量
$*=所有命令行参数,包括$0
此外,sh 还有与命令执行相关的以下内置变量。
$S=执行 sh的进程PID
$?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
sh中,特殊字符$表示替换,要原样使用的话必须带有单引号或反引号\,例如$
示例:

10.3 sh标准
10.3.1 sh变量
sh有许多内置变量,同时用户还可使用任何符号作为sh变量,不需要声明。
可用以下方法设置
variable=string    #:NOTE:no white spaces allowed between tokens
如果a是变量,则$A是变量的值。
10.3.2 sh 语句
首先sh中包含许多特殊符号,要想直接使用,必须加上\或者单引号
例如:
A=xyz
echo  \$A  ==>  \$A  #back quoto $ as is 
echo ‘ $A’  ==>  \$A #NO substitution within SINGLE quotes
echo “see $A"   ==>  see xyz  #substitute $A in DOUBLE quotes
sh语句包括所有的Unix/Linux 命令,以及可能的I/O重定向。
例如:
ls
ls > outfile
data
cp f1 f2
mkdir newdir
cat < filename
除此之外还支持sh程序执行的测试条件、循环、case等语句。
10.4 命令
10.4.1 sh 命令
sh包括许多内置命令,不需要创建新进程,一些常用的如下:
●.file∶读取并执行文件。
● break 【n】∶从最近的第n个嵌套循环中退出。
● cd 【dirname】∶更换目录。
● continue 【n】∶重启最近的第n个嵌套循环。
● eval 【ar …】∶计算一次参数并让 sh执行生成的命令。
● exec 【arg …】∶通过这个sh执行命令,sh将会退出。
● exit 【n】∶使sh退出,退出状态为 n。
● export 【va …】∶将变量导出到随后执行的命令。
● read 【var …】∶从 stdin中读取一行并为变量赋值。
● set 【arg …】∶在执行环境中设置变量。·
● shift∶将位置参数$2 $3…重命名为$1$2…。
● trap 【arg】【n】∶接收到信号n后执行参数。
● umask【ddd】∶将掩码设置为八进制数 ddd 的。
● wait【pid】∶等待进程 pid,如果没有给出 pid,则等待所有活动子进程。
10.4.2 Linux命令
sh可以执行所有的Linux命令,其中有些命令已被广泛使用,下面介绍其中一部分
echo命令:只是将参数字符串作为行回显到 stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
echo This is  a  line #This is a line 
echo "This is a line" # display This is a line
echo -n hi # display hi without NEVILINE
echo there#display hithere
expr命令:将参数字符串转换为数字,然后对数字执行(二进制)操作op,再将得到的数字转换回字符串。
expr string1 OP string2  #OP = any operator on numbers
其他命令:
● awk∶数据处理程序。
● cmp∶比较两个文件。
● comm∶选择两个排序文件共有的行。
● grep∶匹配一系列文件的模式。
● diff:找出两个文件的差异。
● join∶通过使用相同的键来连接记录以比较两个文件。
● sed∶流或行编辑命令。
● sort∶排序或合并文件。
● tail∶打印某个文件的最后n行。
● tr∶一对一字符翻译。
● unig∶从文件中删除连续重复行。
10.5 sh控制语句
sh是一种编程语言,支持许多执行控制语句
if-else-fi语句
  if [condition]
    then
      statemates
    else
      statements
  fi
实际上,if-else-fi 语句通常写成:
if [condition]; then
      statemates
    else
      statements
  fi
if-elif-else-fi 复合语句
  if [condition];then
      commands
    elif [condition2];then
      commands
    else
      commands
  fi
复合条件:必须要用一对匹配的双括号[[和]]括起来。
for 语句
  for VARIABLE in string1 string2 ... stringn
      do
        commands
      done
每次迭代,变量接受一个参数字符串值,并执行关键字do和done之间的命令。
while语句
  while [condition]
    do 
      	commands
    done
until-do语句
  until [$ANS = "give up"]
    do
      	echo -n "enter your answer"
      	read ANS
    done
case 语句
  case $variable in
   	   pattern1)  commands;;
   	   pattern2)  commands;;
   	   patternn)  commands;;
  esac
continue和break语句
同c语言中一样,continue重启最近循环的下一个迭代,break退出最近循环。
10.6 I/O重定向
当进入sh命令时,我们可以指示 sh将I/O重定向到除默认 stdin、stdout 和 sterr 以外的文件。I/O重定向有以下形式和含义∶
>file			stdout转向文件,如果文件不存在,将会创建文件。
>>file		 	stdout 追加到文件
< file		    将文件用作 stdin;文件必须存在并具有r权限。
<< word     	从"here"文件中获取输入,直到只包含"word"的行。
10.7 嵌入文档
可以指示输出命令从stdin获取输入,将其回显到是stdout,直到遇到预先安排的关键字。
10.8 sh 函数
sh函数定义为:
func()
{
# function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
10.9 sh中的通配符
星号通配符∶sh中最有用的通配符是,可扩展到当前目录中的所有文件。
● file*∶列出当前目录中所有文件的信息。
● ls*.c∶列出当前目录中所有以.c结尾的文件。
?通配符∶查询某文件名中的字符
●  file ???∶有3个字符的所有文件名。
● ls *.??∶一个点号.后有2个字符的所有文件名。
【】通配符∶查询文件名中一对 【】 中的字符。
● file *【ab】*∶包含字符a或b的所有文件名。
● ls *【xyz】*∶列出所有包含x、y或z的文件名。
● ls*【a-m】*∶列出包含a到m范围内字符的所有文件名。
大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
在我学习的各种编程语言之中,有一些要素是这些语言都具备的,比如,用于表达具体对象的变量,用于描述具体操作的函数,用于概括整体逻辑关系的算法等等,而shell脚本本身和c语言有着许多相似之处,包括一些逻辑控制语句、linux操作命令,同时也有不同的函数定义模式,文件执行步骤等等,但仍然跑不出,变量、算法、函数等程序设计语言的基本要素。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号