- 实验目的
(1)掌握shell编程的变量、程序控制结构、条件测试等语法。
(2)了解shell 脚本的运行方式
(3)理解shell脚本中的函数
(4)掌握简单shell脚本编写方法 - 实验环境
(1)一台已经安装好的Window系统的计算机。
(2)安装好的CentOS虚拟机。 - 实验内容
编写简单shell脚本 - 实验步骤
(1) 认识shell脚本语言
业界所说的 shell 通常都是指 shell 脚本,但要知道,shell和shell script 是两个不同的概念。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。而Shell 脚本(shell script),是一种为 shell 编写的脚本程序。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell 脚本中直接使用系统命令。同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。
(2) shell变量、输入、输出
定义变量时,变量名不加美元符号,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
• 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
• 中间不能有空格,可以使用下划线_。
• 不能使用标点符号。
• 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用一个定义过的变量,只要在变量名前面加美元符号即可。
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
Linux read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。参数说明如下:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。
1.显示普通字符串:
echo “It is a test”
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo It is a test
2.显示转义字符
echo ““It is a test””
结果将是:
“It is a test”
3.显示换行
echo -e “OK! \n” # -e 开启转义
echo “It is a test”
输出结果:
OK!
It is a test
4.显示不换行
#!/bin/sh
echo -e “OK! \c” # -e 开启转义 \c 不换行
echo “It is a test”
输出结果:
OK! It is a test
5.显示结果定向至文件
echo “It is a test” > myfile
6.原样输出字符串,不进行转义或取变量(用单引号)
echo ‘$name"’
输出结果:
$name"
7.显示命令执行结果
echodate
注意: 这里使用的是反引号 `, 而不是单引号 '。
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014
(3) shell程序控制结构
- if else
if 语句语法格式:
if condition
then
command1
command2
...
commandN
fi
末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。
if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
- for循环
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。
in列表是可选的,如果不用它,for循环使用命令行的位置参数。
while语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:
while condition
do
command
done
无限循环
无限循环语法格式:
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
- until循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until 语法格式:
until condition
do
command
done
(4) shell程序运行方法
1、作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/bash test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
3、source
source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。source 命令格式:source filenamesource 会在当前 Shell 环境下读取并执行 filename 中的命令。该 filename 文件可以无"执行权限"。
(5) 独立编写简单shell脚本,完成循环输入百分制分数,将其转换成等级,直到用户输入q结束
- 分别用while和until实现这个功能,对应两个函数。
第一个函数
第二个函数
- 第一个脚本调用函数实现成绩转换
运行
- 第二个脚本用select实现,提供1.while 2.until *break 三个选项用来选择
运行
(6)shell函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)。
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数.
5. 实验思考题
(1)脚本语言和编程语言有何区别?
- 脚本语言不需要编译器因而省去了编译的过程减少了开发的时间,而编程语言需要编译所以时间更长点
- 脚本语言是一种动态语言,也就是说可以实时的更改代码,而不需要将程序停止下来,这是一种高级特性。而Java等编程语言是静态的语言,一旦编译完成并且运行就不能更改代码,除非将程序停止下来
- 脚本语言非常容易学习,但是不够全面缺乏系统性而且语法较为散漫。而高级编程语言虽然相对难学,但是规则强可以编程出简洁美观的代码,并且可读性也相对较强。
- 一般来说脚本语言通用性较差,但是可以通过专门的应用来调整。
- 随着技术的发展,其实脚本语言变得越来越强,和编程语言的界限也比较模糊,比如Python,可以将它视为编程语言了,因为它很强大。
(2)如何引用变量?
$+变量名
(3)用./运行一个shell脚本时,要注意必须赋予脚本什么权限?
可执行权限。chmod +x ./test.sh #使脚本具有执行权限