加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

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

发布时间:2023-01-29 13:30:54 所属栏目:Unix 来源:未知
导读: Shell脚本的参数
shell变量分类
环境变量
预定义变量(只读变量)
脚本相关的预定义变量:
位置参数:是一种在调用Shell程序的命令行中按照各自的位置决定的变量。
自定义变量
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)就是待捕捉的信号

脚本在捕捉到一个信号以后,通常会采取某些

行动最常见的行动包括:

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

常见的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/johnunix练习,用户当前所在的目录是

/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)

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章