学习笔记3

第10章 sh编程

  1. sh脚本
    sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
    sh脚本的第一行通常以 #! 组合开始,通常称为shebang。

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

  1. 命令行参数
    在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前十个:$0-$9;其他:${10}-${n}。或通过shift命令查看。
    $0是程序名本身,$1到$n是程序的参数。在sh中,可用内置变量 $# 和 $* 计数并显示命令行参数。
    $# = 命令行参数$1到$n的数量
    $* = 所有命令行参数,包括$0
    $S = 执行sh的进程PID
    $? = 最后一个命令执行的退出状态(如果成功则为0,否则为非0)

  2. sh变量

  • 包括内置变量:PATH、HOME、TERM等,或使用任何符号作为sh变量。
  • 所有sh变量值都是字符串。未赋值的sh变量是NULL字符串。
  • 设置或赋值sh变量:
点击查看代码
variable=string
如果A是一个变量,则$A是变量的值。
  1. sh中的引号
    \:用于引用单个字符
    ‘(单引号):用于引用长字符串。单引号内没有替换。
    “(双引号):用于保留双引号字符串中的空格。双引号内会发生替换。

  2. sh语句
    sh语句包括所有Unix/Linux口令,以及可能的I/O重定向;还支持控制sh程序执行的测试条件、循环、case等语句。

  3. 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:从文件中删除连续重复行

  1. 命令替换
    sh遇到 'cmd' 或 $(cmd) 时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)。

  2. 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
* 复合条件 sh允许在复合条件中使用 &&(AND) 和 ||(OR) ,条件必须用一对匹配的双括号 [[ 和 ]] 括起来。也可以通过()进行分组,以执行计算命令。

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退出最近循环。

  1. I/O重定向
  • 进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr之外的文件。
    “>file” stdout转向文件,如果文件不存在,将会创建文件
    “>>file” stdout追加到文件
    “<file” 将文件用作stdin;文件必须存在并具有r权限
    “<<word” 从“here”文件中获取输入,直到只包含“word”的行
  1. 嵌入文档
    可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇见预先安排的关键字。

  2. sh函数
    定义:

点击查看代码
func()
{
  # function code
}

sh语句 func s1 s2 ... sn 调用sh函数

  1. sh中的通配符
  • 通配符:可扩展到当前目录中的所有文件
    ? 通配符:查询某文件名中的字符
    [ ] 通配符:查询文件名一对[ ]中的字符
  1. 命令分组
    sh脚本使用{}或()对命令进行分组
    {ls;mkdir abc;ls;}
    (cd newdir;ls;A=value;mkdir $A)

  2. eval语句
    eval [arg1 arg2 ... argn]
    由sh自己执行,不需要复刻新进程。它将输入参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。

  3. 调试sh脚本
    由带有-x选项的子sh运行,如:bash -x mysh
    子sh在执行命令前显示要执行的每个sh命令,包括变量和命令替换。它允许用户跟踪命令执行。如果出现错误,sh将在错误行上停止并显示错误消息。

苏格拉底挑战

posted @ 2023-09-22 08:07  窦豆  阅读(30)  评论(0)    收藏  举报