学习笔记3
第10章 sh编程
- 
sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
sh脚本的第一行通常以 #! 组合开始,通常称为shebang。 - 
sh脚本和C程序
sh:
(1)是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行行且为内置命令,则sh可执行;否则复制一个子进程执行命令,并等待子进程终止后继续。
(2)每个变量都是字符串。不需要类型。
(3)第一个可执行语句是程序的入口点。
C程序:
(1)必须先编译链接到一个二进制可执行文件,通过主sh的子进程运行二进制可执行文件。
(2)C程序中,每个变量必须有一个类型。
(3)每个C程序必须要有一个main()函数,每个函数必须定义一个返回值类型和参数。 

- 
命令行参数
在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前十个:$0-$9;其他:${10}-${n}。或通过shift命令查看。
$0是程序名本身,$1到$n是程序的参数。在sh中,可用内置变量 $# 和 $* 计数并显示命令行参数。
$# = 命令行参数$1到$n的数量
$* = 所有命令行参数,包括$0
$S = 执行sh的进程PID
$? = 最后一个命令执行的退出状态(如果成功则为0,否则为非0) - 
sh变量
 
- 包括内置变量:PATH、HOME、TERM等,或使用任何符号作为sh变量。
 - 所有sh变量值都是字符串。未赋值的sh变量是NULL字符串。
 - 设置或赋值sh变量:
 
点击查看代码
variable=string
- 
sh中的引号
\:用于引用单个字符
‘(单引号):用于引用长字符串。单引号内没有替换。
“(双引号):用于保留双引号字符串中的空格。双引号内会发生替换。 - 
sh语句
sh语句包括所有Unix/Linux口令,以及可能的I/O重定向;还支持控制sh程序执行的测试条件、循环、case等语句。 - 
sh命令
 
7.1. 内置命令
.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:将位置参数$2 $3...重命名为$1 $2...
trap[arg][n]:接收到信号n后执行参数
umask[ddd]:将掩码设置为八进制数ddd的
wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程
read命令:sh执行此命令时,它会等待来自stdin的输入行,将输入行划分为几个标记,分配给列出的变量。常见用法:允许用户与正在执行的sh进行交互。获得输入后,sh可能会测试输入字符串以决定下一步。
7.2. Linux命令
sh可以执行所有的Linux命令。
echo命令:将参数字符串作为行回显到stdout。通常将相邻的多个空格压缩为一个空格,除非有引号。
expr命令:
- (所有的sh变量都是字符串,所以不能直接改为数值。)通过expr命令可间接更改sh变量的值。
 - expr也可用于对其值为数字字符串的sh变量执行其他算术操作。
 - expr是一个程序:expr string1 op string2 (将两个参数字符串转换为数字,对数字执行二进制操作op,再将得到的数字转换回字符串)
 
管道命令:在sh脚本中经常使用管道作为过滤器。
实用命令:
awk:数据处理程序
cmp:比较两个文件
comm:选择两个排序文件共有的行
grep:匹配一系列文件的模式
diff:找出两个文件的差异
join:通过使用相同的键来连接记录以比较两个文件
sed:流或行编辑命令
sort:排序或合并文件
tail:打印某个文件的最后n行
tr:一对一字符翻译
uniq:从文件中删除连续重复行
- 
命令替换
sh遇到 'cmd' 或 $(cmd) 时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)。 - 
sh控制语句
 
9.1. if-else-fi
每个语句必须在单独的一行上
点击查看代码
if [ condition ]
   then
      statements
   else
      statements
fi
点击查看代码
if [ condition ]; then
    statements
 else
    statements
fi
- 
在sh中,0为TRUE,非0为FALSE。若[]内程序执行成功,则退出状态为0,测试条件为真,否则非0,测试条件为假。
 - 
作用:比较字符串、数值(运算符-eq、-ne、-lt、-gt等将参数作为整数进行比较)、测试文件操作中经常需要的文件类型和文件属性。
 - 
if-elif-else-fi复合语句
类似C语言的if-else if-else 
点击查看代码
if [ condition ]; then
     commands
  elif [ condition2 ]; then
     commands
  # additional elif [ condition3 ]; then etc.
  else
     commands
fi
9.2. for语句
每次迭代中,变量接受一个参数字符串值,并执行关键字 do 和 done 之间的命令。
点击查看代码
for VARIABLE in string1 string2 .... stringn
  do
    commands
  done
9.3. while语句
条件为真时,sh重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。
点击查看代码
while [ condition ]
  do
    commands
  done
9.4. until-do语句
点击查看代码
until [ $ANS = "give up" ]
  do
       echo -n "enter your answer : "
       read ANS
  done
9.5. case语句
点击查看代码
case $variable in
     pattern1)   commands;;
     pattern2)   command;;
     patternN)   command;;
esac
9.6. continue和break语句
continue重启最近循环的下一个迭代,break退出最近循环。
- I/O重定向
 
- 进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr之外的文件。
“>file” stdout转向文件,如果文件不存在,将会创建文件
“>>file” stdout追加到文件
“<file” 将文件用作stdin;文件必须存在并具有r权限
“<<word” 从“here”文件中获取输入,直到只包含“word”的行 
- 
嵌入文档
可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇见预先安排的关键字。 - 
sh函数
定义: 
点击查看代码
func()
{
  # function code
}
sh语句 func s1 s2 ... sn 调用sh函数
- sh中的通配符
 
- 通配符:可扩展到当前目录中的所有文件
? 通配符:查询某文件名中的字符
[ ] 通配符:查询文件名一对[ ]中的字符 
- 
命令分组
sh脚本使用{}或()对命令进行分组
{ls;mkdir abc;ls;}
(cd newdir;ls;A=value;mkdir $A) - 
eval语句
eval [arg1 arg2 ... argn]
由sh自己执行,不需要复刻新进程。它将输入参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。 - 
调试sh脚本
由带有-x选项的子sh运行,如:bash -x mysh
子sh在执行命令前显示要执行的每个sh命令,包括变量和命令替换。它允许用户跟踪命令执行。如果出现错误,sh将在错误行上停止并显示错误消息。 
苏格拉底挑战



                    
                
                
            
        
浙公网安备 33010602011771号