实验6:shell编程

  1. 实验目的
    (1)掌握shell编程的变量、程序控制结构、条件测试等语法。
    (2)了解shell 脚本的运行方式
    (3)理解shell脚本中的函数
    (4)掌握简单shell脚本编写方法
  2. 实验环境
    (1)一台已经安装好的Window系统的计算机。
    (2)安装好的CentOS虚拟机。
  3. 实验内容
    编写简单shell脚本
  4. 实验步骤
    (1) 认识shell脚本语言
    业界所说的 shell 通常都是指 shell 脚本,但要知道,shell和shell script 是两个不同的概念。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。而Shell 脚本(shell script),是一种为 shell 编写的脚本程序。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell 脚本中直接使用系统命令。同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。
    (2) shell变量、输入、输出
    定义变量时,变量名不加美元符号,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    • 中间不能有空格,可以使用下划线_。
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字)。
    使用一个定义过的变量,只要在变量名前面加美元符号即可。
    运行shell时,会同时存在三种变量:
  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. 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.显示命令执行结果
    echo date
    注意: 这里使用的是反引号 `, 而不是单引号 '。
    结果将显示当前日期
    Thu Jul 24 10:08:46 CST 2014

(3) shell程序控制结构

  1. 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
  1. 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 (( ; ; ))
  1. 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结束

  1. 分别用while和until实现这个功能,对应两个函数。
    第一个函数
    在这里插入图片描述

第二个函数
在这里插入图片描述

  1. 第一个脚本调用函数实现成绩转换
    在这里插入图片描述

运行
在这里插入图片描述

  1. 第二个脚本用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 #使脚本具有执行权限

猜你喜欢

转载自blog.csdn.net/m0_48385518/article/details/124639533