shell变量分类
环境变量
预定义变量(只读变量)
脚本相关的预定义变量:
位置参数:是一种在调用Shell程序的命令行中按照各自的位置决定的变量。
自定义变量
Shell预定义变量
位置参数
命令行的参数可以作为参数传递给Shell脚本
使用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脚本中,软中断的是通过trap命令来实现的
格式:
trap “action” signal(s)
功能:
在脚本中捕获信号。
action是捕捉到信号后所采取的处理动作。
singlal(s)就是待捕捉的信号
脚本在捕捉到一个信号以后,通常会采取某些
行动最常见的行动包括:
位置参数用来给脚本传递命令行参数
使用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)