实验四 shell脚本
    一. 实验目的:
    1.掌握shell脚本的创建和执行的方法;
    2.掌握shell脚本中变量及其赋值的方法;
    3.掌握echo、read、test等常用命令;
    4.熟悉一些位置变量、#变量、?变量等特殊变量;
    5.熟悉流程控制语句的基本格式;
    6.了解函数的基本格式。
    二. 实验环境:
    Red Hat Enterprise Linux 6以上
    三. 实验内容:
    1.shell脚本的创建和执行;
    2.shell脚本中变量及其赋值的方法;
    3.echo、read、test等常用命令;
    4.一些位置变量、#变量、?变量等特殊变量;
    5.流程控制语句的基本格式;
    6.函数的基本格式。
    四、 实验练习:
    1、shell脚本的创建和执行
    如无特别说明,本实验所有命令都在root用户的家目录/root目录中操作
    (1)创建shell脚本的命令:vi
    #vi myfile.sh (用vi编辑器建立一个名为myfile.sh的shell脚本)
    (2)在vi编辑器中输入以下三行内容,然后保存退出。
    #!/bin/bash
    clear
    date
    ( 注:#!/bin/bash 为第一行必输内容,其他clear和date两个为命令)
    至此 创建了一个名为myfile.sh的shell脚本。
    (3)执行shell脚本
    运行shell程序可以有三种方法:
    1)、采用启动shell的sh命令
    #sh myfile.sh
    2)、修改文件的可执行权限,在当前目录下键入./文件名,回车即可;
    #chmod u+x myfile.sh (修改文件的可执行权限)
    #./myfile.sh (执行该脚本)
    3)、修改文件的可执行权限,把当前目录添加到搜索路径中(.bash_profile文件)。在 任意目录下键入文件名回车即可执行该脚本。
    #chmod u+x myfile.sh (修改文件的可执行权限)
    #vi .bash_profile (用vi编辑器打开位于用户家目录下的文件 .bash_profile)
    在打开的 .bash_profile中,找到PATH=$PATH:$HOME/bin
    并在其后添加root用户的家目录:/root,如下图所示:
    image.png
    保存退出,执行source命令让配置文件生效
    #source .bash_profile
    然后在任意目录下输入脚本名,即可执行
    #myfile.sh


    2、shell脚本中变量及其赋值的方法
    (1)#A=test1 (将test1赋给变量A,注意等号两边不能有空格)
    (2)#B=‘hello everybody’ (如果将一个包含空格的字符串赋给用户变量,应用单引号将该字符串括起来)
    (3)#read C (用read命令从键盘给变量C赋值)
    #testc (输入变量C的内容为“testc”)
    将命令执行结果赋给变量
    #D=date 或者 D=$(date) (将命令date的执行结果赋给变量D)
    显示变量的值
    #echo $A (显示变量A的值)
    #echo $B (显示变量B的值;自己查看变量C和D的值)。
    3、echo、read、test等常用命令
    (1)echo [选项] [“要显示的信息”或 $变量]
    #echo $A (显示变量A的值)
    #echo “have a good day” (将信息have a good day显示在屏幕上)
    (2)read [选项] 变量名
    #read C (用read命令从键盘给变量C赋值)
    #testc (输入变量C的内容为“testc”)
    #read -p “please input your name:” E (在屏幕上显示提示信息)
    (3)测试语句与各种条件语句结合使用。
    格式1:
    test expression
    格式2:
    [ expression ]
    注意:在test语句中的变量应用双引号将之括起来;在运算符、圆括号及方括号前后需留空格;若下一行继续测试表达式,应加反斜杠。
    例:
    #test abcd = cdef (格式1:比较两个字符串abcd和cdef是否一样)
    #[ abcd = cdef ] (格式2:比较两个字符串abcd和cdef是否一样)
    #echo $? (显示测试语句返回的结果值,如果为真返回0,假返回1)
    #test 23 -lt 28 (格式1:比较23是否小于26)
    #[ 23 -lt 28 ] (格式2:比较23是否小于26)
    #echo $? (显示测试语句返回的结果值,如果为真返回0,假返回1)
    4、一些位置变量、#变量、?变量等特殊变量
    在shell中有1种特殊的变量,称为位置变量。位置变量用于存放那些传递给命令行上shell程序或shell脚本函数的参数。这些变量是数字0~9,shell将命令行中的参数依次赋给变量1、2、……、9,将命令名赋给变量0。
    例如:某个shell程序名为test.sh,执行带3个参数,则shell解释执行时位置变量0的内容为test.sh,位置变量1的内容为参数1,依此类推。
    创建一个名为myfile1.sh的脚本,输入内容如下:
    #!/bin/bash
    echo $1 (显示位置变量1的值,即第一个参数的值)
    echo $2 (显示位置变量2的值,即第二个参数的值)
    echo $3 (显示位置变量3的值,即第三个参数的值)
    保存退出,然后输入以下命令执行
    #sh myfile1.sh a b cd (a为第一个参数的值,b为第二个参数的值,cd为第三个)
    执行结果在屏幕上分别显示各个位置变量的值
    #a
    #b
    #cd

    5、流程控制语句的基本格式
    Linux中shell脚本流程控制语句包括if、case、for、while、until等。
    (1)、使用if-then-else语句创建一个根据输入的分数判断是否及格的shell脚本score.sh
    #vi score.sh
    然后输入以下信息:
    #!/bin/bash
    echo -n “please input your score:”
    read SCORE
    echo “you input score is $SCORE”
    if [ $SCORE -ge 60 ]
    then
    echo “OK! You pass”
    else
    echo “Sorry! You fail”
    fi
    保存退出,执行,输入一个分数,得到相对应的输出结果。
    (2)、使用while语句创建一个根据输入的数值求累加和(1+2+3+…+n)的shell脚本sum.sh
    #vi sum.sh
    然后输入以下信息:
    #!/bin/bash
    echo -n “please input number:”
    read NUM
    number=0
    sum=0
    while [ $number -le $NUM ]
    do
    echo number
    echo “$number”
    number=expr $number + 1 (注意这里是反引号,是键盘第二行第一个键)
    echo sum
    echo “$sum”
    sum=expr $sum + $number
    done
    保存退出,执行,输入一个数字,得到相对应的输出结果。

    6、函数的基本格式
    将实验第5部分的两个脚本作为函数,建立一个shell脚本 fun.sh
    #vi fun.sh
    然后输入以下信息:
    #!/bin/bash

    Score() (定义第一个函数score)
    {
    echo -n “please input number:”
    read NUM
    number=0
    sum=0
    while [ $number -le $NUM ]
    do
    echo number
    echo “$number”
    number=expr $number + 1 (注意这里是反引号,是键盘第二行第一个键)
    echo sum
    echo “$sum”
    sum=expr $sum + $number
    done
    }
    sum() (定义第二个函数sum)
    {
    echo -n “please input your score:”
    read SCORE
    echo “you input score is $SCORE”
    if [ $SCORE -ge 60 ]
    then
    echo “OK! You pass”
    else
    echo “Sorry! You fail”
    fi
    }

    score (调用第一个函数)
    sum (调用第二个函数)
    score (再调用第一个函数)
    保存退出,执行,分析结果。