UNIX Shell(3)——Shell编程基础

Shell脚本的参数

shell变量分类
环境变量

预定义变量(只读变量)
脚本相关的预定义变量:
位置参数:是一种在调用Shell程序的命令行中按照各自的位置决定的变量。

自定义变量

Shell预定义变量
在这里插入图片描述
位置参数
命令行的参数可以作为参数传递给Shell脚本
在这里插入图片描述

算术运算expr命令

使用expr命令可以实现整数运算

expr命令支持下列运算操作符
在这里插入图片描述
expr示例:
在这里插入图片描述
使用( ) 组合表达式,定义运算次序:
在这里插入图片描述
使用命令替换将运算结果保存在变量中:
在这里插入图片描述

条件执行

用一个或者一组命令的返回码来决定下一命令是否执行:
在这里插入图片描述
在这里插入图片描述
条件测试命令:test
语句:
– 格式1: test expression
– 格式2: [ expression ]
– 格式3: [ [ expression ] ]

功能:判断给定条件表达式是否成立,并返回一个true或false。

使用说明:test多用于if和while控制结构中。
– 格式1和格式2是等价的,格式3是扩展的test 命令
– 在[[ ]]中可以使用通配符进行模式匹配
– &&, ||, <, 和>能够正常存在于[[ ]]中,但不能在[ ]中出现
– [ 和 [[ 之后的字符必须为空格, ] 和 ]] 之前的字符必须为空格
– 要对整数进行关系运算也可以使用 (( )) 进行测试

逻辑测试
在这里插入图片描述
test运算表
在这里插入图片描述
使用if结构
在这里插入图片描述
示例:
在这里插入图片描述
read命令:
read命令从标准输入读入一行,然后将每个字段的值依次赋给shell变量
在这里插入图片描述
使用case结构
在这里插入图片描述
表达式 expr 按顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面的所有命令,然后退出 case。
如果 expr 没有找到匹配的模式,则执行缺省值 “ *) ” 后面的命令块 ( 类似于 if 中的 else );
“ *) ” 可以不出现。
所给的匹配模式 pattern 中可以含有通配符和“ | ”。
每个命令块的最后必须有一个双分号,独占一行或放在最后一个命令的后面。

示例:
在这里插入图片描述

循环结构

for语句
在这里插入图片描述
示例:
在这里插入图片描述
for语句(ksh93,C语言样式)
在这里插入图片描述
while语句
在这里插入图片描述
示例:
在这里插入图片描述
要处理大量的shell参数列表(例如文件名),通常在whlie循环中使用shift命令。

在这里插入图片描述
until语句
在这里插入图片描述
select语句
在这里插入图片描述
Select用来构造循环的菜单,菜单项为args列表,格式化为每个arg前面加一个数字,如果省略关键字in和参数列,使用位置参数代替args
菜单的提示符在PS3定义,用户所选的数字保存在REPLY
根据用户的选择给变量variable赋值,并执行一系列命令
永真循环调用,通过break或者exit退出循环

示例:
在这里插入图片描述

函数

Shell函数简介
为了避免大型脚本变得复杂、晦涩而使用函数将大型脚本代码分割成小块,将这些被命名的代码块称为函数
– 一个函数就是一个子程序,用于完成特定的任务
– 例如:添加一个用户、判断用户是否为管理员 等
函数定义之后可以被使用它的主程序调用
– 调用函数的方法与执行Shell命令无异
– 可以在Shell脚本中调用(函数需先定义而后调用)
– 在命令行上直接调用(定义函数的文件需先加载)

为什么要使用函数
简化程序代码,实现代码重用
– 实现一次定义多次调用。如:is_root_user()函数可以由不同的shell脚本重复使用。
实现结构化编程
– 使脚本内容更加简洁,增强程序的易读性
提高执行效率
– 将常用的功能定义为多个函数并将其保存在一个文件中
– 类似其他语言的“头/模块”文件
– 在 ~/.kshrc 或命令行上使用 .(dot) 命令调用这个文件
– 此文件中定义的多个函数一次性地调入内存,从而加快运行速度

函数的定义和调用
在这里插入图片描述
函数的存储和显示
函数的存储
– 函数和调用它的主程序保存在同一个文件中
– 函数的定义必须出现在调用之前

– 函数和调用它的主程序保存在不同的文件中
– 保存函数的文件必须先使用.(dot)命令执行,之后才能调用其中的函数

函数的显示
– 显示当前Shell可见的所有函数名
$ typeset +f
– 显示当前Shell可见的所有(指定)的函数定义
$ typeset -f
$ typeset -f

示例:
在这里插入图片描述
函数与变量
参数
– 调用函数时,使用位置参数的形式为函数传递参数
– 函数内的 1 − 1- 1{n} 、$* 和 $@ 表示其接收的参数
– 函数调用结束后位置参数 1 − 1- 1{n} 、$* 和 $@ 将被重置为调用函数之前的值
– 在主程序和函数中,$0始终代表脚本名

变量
– 函数内使用 local 声明的变量是局部(Local)变量
– 局部变量的作用域是当前函数以及其调用的所有函数
– 函数内未使用 local 声明的变量是全局(Global)变量
– 即主程序和函数中的同名变量是一个变量(地址一致)

示例:
在这里插入图片描述
函数的结束与返回值
当函数的最后一条命令执行结束函数即结束
– 函数的返回值就是最后一条命令的退出码
– 其返回值被保存在系统变量$?中

可以使用 return 或 exit 显式地结束函数
– return [N]
– return 将结束函数的执行
– 可以使用 N 指定函数返回值

– exit [N]
– exit 将中断当前函数及当前Shell的执行
– 可以使用 N 指定返回值

示例:
在这里插入图片描述

命令搜索顺序

在这里插入图片描述
Shell内部命令
shell内部命令是内建于shell中命令,使用这些命令的时候不会开启子shell,因而使用
内部命令比系统里的外部命令运行速度快。
由于性能的原因,在进行shell编程时,应该尽量使用内部命令。

Shell内部命令列表
在这里插入图片描述
在这里插入图片描述

软中断

软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果

在shell脚本中,软中断的是通过trap命令来实现的

格式:
trap “action” signal(s)

功能:
在脚本中捕获信号。
action是捕捉到信号后所采取的处理动作。
singlal(s)就是待捕捉的信号

脚本在捕捉到一个信号以后,通常会采取某些
行动最常见的行动包括:

  1. 清除临时文件。
  2. 忽略该信号。
  3. 询问用户是否终止该脚本的运行。

常见的trap命令用法:
在这里插入图片描述

小结

位置参数用来给脚本传递命令行参数
使用test命令来检验一个特定的条件
检验可以if语句一起使用,用来控制程序的流程,允许在脚本中条件执行
case语句根据表达式的值按顺序匹配每一个模式,执行匹配模式的所有命令,然后退出case
read命令用来实现交互式的脚本
while语句用来维持循环直到条件失败
for语句允许重复执行一段代码一定的次数
函数将大型脚本代码分割成小的代码块,一个函数就是一个子程序,用于完成特定的任务,可以增强代码的可读性、重用和程序的性能

习题

1、下面的命令匹配的文件名是什么?
$ ls ???[!a-z]*[0-9]t
匹配的文件名满足下列条件:
前的三个字符为任意字符
第四个字符不是a-z中的一个字符
接下来是0或多个任意字符
倒数第二个字符是0-9中任意一个字符
最后一个字符是t

2、UNIX的标准文件有哪些,分别对应什么设备?
UNIX的标准文件是标准输入,标准输出和标准错误输出,分别对应键盘,屏幕,屏幕

3、下列命令的标准输入,标准输出和标准错误分别是什么?
A. $ cat file1
B. $ mail tim < letter
C. $ cat .profile > newprofile 2> 1
A:
标准输入:键盘
标准输出:屏幕
标准错误:屏幕
B:
标准输入:letter文件
标准输出:屏幕
标准错误:屏幕
C:
标准输入:键盘
标准输出:newprofile
标准错误:文件1

4、用cat命令显示filea的内容,要求将输出定义到不同的位置,写出相关命令。
A. 输出发送到文件fileb,错误发送到filec
B. 输出和错误联合一起发送到fileb
C. 输出发送到fileb,不显示并丢弃错误信息。
A:cat filea > fileb 2>filec
B:cat filea > fileb 2>&1
C: cat filea > fileb 2> /dev/null

5、假定用户的home目录是/home/john,用户当前所在的目录是
/home/john/doc,该目录下有aa,bb,cc三个文件,下列命令的输出结
果是什么
$ pwd
$ echo “Home directory is $HOME”
$ echo ‘Home directory is $HOME’
$ echo "Current directory is pwd"
$ echo “Current directory is $(pwd)”
$ echo “Files in this directory are *”
$ echo * $HOME
$ echo *
/home/john/doc
Home directory is /home/john
Home directory is $HOME
Current directory is /home/john/doc
Current directory is /home/john/doc
Files in this directory are *
aa bb cc /home/john
*

6、下面的命令有何作用
$ echo “Today is date and who | wc -l users are logged in”
显示当前系统日期和已经登录的用户数

7、如何查看当前shell的pid
echo $$

8、下面的shell脚本能完成什么功能
TERMTYPE=$TERM
if [ $TERMTYPE != “” ] ;then
if [ -f /home/team01/customized_script ] ;then
/home/team01/customized_script
else
echo No customized script available !
fi
else
echo You do not have a TERM variable set !
fi
设置TERMTYPE变量值等于TERM变量,如果TERMTYPE变量不为空,则在/home/team01目录下查找名为customized_script的脚本,如果该脚本存在则执行它;如果它不存在,则显示未找到;如果TERMTYPE变量为空,则显示没有设置TERM变量。

9、编写ksh脚本,可以从键盘读取3个10到30之间的整数到变量a,b,c,,并且计算出(a+b)*c的值,当输入值不满足要求时,要给用户相应的提示,并且要求用户重新输入。
在这里插入图片描述

10、编写ksh脚本,要求用户输入源目录和目标目录,然后列出源目录下所有的文件,并将这些文件拷贝到目标目录,并在文件名后面加上时间戳。
在这里插入图片描述
在这里插入图片描述

11、编写bash脚本,能够对用户输入的多个数值进行冒泡排序,并将排序结果按从小到大的顺序输出。
在这里插入图片描述

(内容来自湖南大学肖老师的PPT)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值