美文网首页Shell和命令
12-Shell脚本_练习

12-Shell脚本_练习

作者: ibo | 来源:发表于2017-02-03 15:43 被阅读22次
    变量 :
    • 使用变量时, 必须在变量名前加$
    • 用户自定义变量 :
      • 没有数据类型和存储类型
      • 直接定义使用, 在定义时必须赋值
      • 在 = 的左右两端不要出现空格符
      • 如果值出现空格, 需要使用" "
    • echo $var : 不关心不可见字符
    • echo "$var" : 原样输出
    *exit : 退出 , 结束
    * 一条命令的输出结果作为值赋给变量时, 需要使用 ` ` (命令置换符)
    vi 分屏 :
    • 处于vi界面; 在底行模式 vsp 文件名
    • 注意文件必须在当前路径下, 文件名个数只能为一个.
    • 在命令行, vi -o 文件名....
    • vi -O 文件名
    位置变量 :
    • $? : 获取上一条命令的执行状态,
    • 0 : 代表执行成功 , 1或者其他非零值:失败或者出错
    输入 : read 变量定义
    输出 : echo 变量引用
    数据运算 :
    • expr : + - *(乘法运算符) / %
    • 在使用expr命令进行运算时, 在运算符左右两端至少有一个空格符存在
    • expr $num1 + $num2 ==== ((num1 + num2))
    test 语句 :
    • 字符串 整数 文件属性
    • 字符串 : =
    • test 字符串1 =或者!= 字符串2 === [ 字符串1 =或者!= 字符串2 ]
    • 注意 : 在[ 的右端 和 ] 的左端 至少有一个空格符存在 .
    • test 数字1 选项 数字2
    • 两条test语句时, 用&& 表示与 ; 用 || 表示 或
    • 一条test语句时, 用-a 表示与 ; 用 -o 表示 或
    获取测试结果, $? 0 : 成立 1 : 不成立
    条件 :

    -eq (等于)

    -ne (不等于)

    -gt (大于)

    -ge (大于等于)

    -lt (小于)

    -le (小于等于)

    文件属性 :
    test 选项 文件名

    -r

    -w

    -x

    -d

    -f

    -e

    结构性语句:
    if 语句  
    then
        命令列表
    fi
    
    if 命令
    then
        命令列表1
    else if
    then
        命令列表2
    else
        命令列表n
    fi
    fi
    
    case 变量的引用 in
        模式1)      # 允许 模式1 | 模式2 | 模式3) 的使用.
            命令列表1
            ;;      #  注意: ;;不能够省略, 作用强制跳出case语句的执行.
        模式2)
            命令列表2
            ;;
        模式3)
            命令列表3
            ;;
            *)      # 注意 \* 出现的位置.
            命令列表n
            ;;      # 处于case语句结尾的;; 可以省略
    esac
    

    循环 :

    执行: 变量从单词表中取出单词, 每取一次,循环执行一次;直到所有单词被依次取一遍结束, 循环结束.
    while 命令
    do
        命令列表
    done
    
    while :
    do
        命令列表
    done    # 死循环 , : 不能够省略
    
    until
    
    
    for 变量的定义 in  单词表
    do
        命令列表
    done
    
    for 变量的定义
    do
        命令列表
    done     
    
    单词表部分有命令行输入 , 此时for循环执行次数由命令行传入参数个数决定.
    break : 支持跳出多层循环.
    continue : 支持结束多层循环的当前次循环.

    函数

    • 函数 : 没有返回值类型 以及 参数类型
    • 在函数体内部没有 return 语句
    function fun()   # function 可以省略不要
    {
        命令列表
    }
    
    • 函数使用:

    • fun

    • 或者

    • info=`fun`

    • echo $info

    • 局部变量 : local 变量名

    • 在函数体内部有return语句,如果返回的为整数, 其取值范围在 0 ~ 255

    • 函数使用:

    fun
    echo $?
    
    
    fun
    var=$?
    echo $var
    

    练习 :

    1.在家目录下创建文件夹 file_dir 和 dir_dir , 创建前, 判断文件夹file_dir 和 dir_dir 是否存在 ; 存在, 删除重新创建; 不存在, 直接创建 , 输入一个字符串, 当作目录文件进行处理;判断输入是否为目录文件, 不是-> 报错退出; 是->把该目录下的目录文件、普通文件分别拷贝到 dir_dir 、file_dir ; 并且统计目录文件以及普通文件的个数.
    #!/bin/bash  
    
    if [ -e $HOME/file_dir ]
    then
        rm -rf $HOME/file_dir
    fi
    
    if [ -e $HOME/dir_dir ]
    then
        rm -rf $HOME/dir_dir
    fi
    
    mkdir $HOME/file_dir
    mkdir $HOME/dir_dir
    
    echo -n "请输入一个目录名 : "
    read dirname
    
    num1=0
    num2=0
    if [ -d $dirname ]
    then
    #   cd $dirname
        str=`ls $dirname`
        for var in $str
        do
            if [ -f $dirname/$var ]
            then
                cp $dirname/$var $HOME/file_dir
                ((num1++))
            else if [ -d $dirname/$var ]
            then
                cp -a $dirname/$var $HOME/dir_dir
                ((num2++))
            else
                echo "该文件为其他类型, 不做处理"
            fi
        fi
    done
    else
        echo "该文件不存在或者不是目录文件"
    fi
    
    echo "该目录下普通文件个数为: $num1"
    echo "该目录下目录文件个数为: $num2"
    
    2.check_user : 检查获取到的用户(/etc/passwd)是否存在, 存在,返回用户信息所在的行号; 不存在, 返回 0 , show_user : 获取check_user返回的行号, 并显示出对应用户的信息(用户名, UID,GID) , 循环获取输入, 判断用户是否存在 (调用 check_user 函数) ; 如果存在, 显示其信息 (show_user) ; 不存在, 提示, 重新输入 , 直到输入的为 quit ; 程序结束.
    #!/bin/bash  
    
    function check_user()
    {
        eist=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" -n | cut -d ":" -f 1 | wc -l`
        if [ $eist -eq 0 ]
        then
            return 0
        else
            line=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -n | cut -d ":" -f 1`
            return $line
        fi
    }
    
    function show_user()
    {
        info=`cat /etc/passwd | head -$1 | tail -1 | cut -d ":" -f 1,3,4`
        echo "$info"
    }
    while :
    do
        echo -n "请输入一个用户名 : "
        read username
    
        if [ $username = "quit" ]
        then
            break
        fi
    check_user $username
    ret=$?
    
    if [ $ret -eq 0 ]
    then
        echo "该用户不存在, 请重新输入"
        continue
    fi
    
    show_user $ret
    done
    
    3.输入一个成绩(0 ~ 100), 90 ~ 100 A , 80 ~ 90 B , 60 ~ 80 C , 60 以下 NO PASS
    #!/bin/bash  
    
    echo -n "请输入一个成绩: "
    read score
    
    if [ $score -gt 100 -o $score -lt 0 ]
    then
        echo "输入有误"
        exit
    fi
    
    if [ $score -ge 90 -a $score -le 100 ]
    then
        echo A
    else if [ $score -ge 80 ]
    then
        echo B
    else if [ $score -ge 60 ]
    then
        echo C
    else
        echo "NO PASS"
    fi
    fi
    fi
    
    4.输入一个字符串, 当作文件名进行处理 判断文件是否存在, 不存在, 报错退出 exit ;如果存在, 判断该文件是否为普通文件, 是 ; 打印提示信息 不是, 继续判断是否为目录文件, 是 , 打印 delete it ? [ y | n] 获取输入, y -> 删除文件夹, n -> 不删除文件夹 , 其他字符 , 报错退出.
    #!/bin/bash  
    
    echo -n "请输入一个文件名 : "
    
    read fname
    
    if [ ! -e $fname ]
    then
        echo "该文件不存在"
        exit
    else if [ -f $fname ]
    then
        echo "该文件为普通文件"
    else if [ -d $fname ]
    then
        echo -n "delete it ? [y | n]"
        read ans
        if [ $ans = "y" ]
        then
            rm -rf $fname
        else if [ $ans = "n" ]
        then
            echo "该文件不需要删除"
        else
            echo "输入有误"
            exit
        fi
    fi
    else
        echo "该文件为其他类型文件"
    fi
    fi
    fi
    
    5.在家目录下创建文件夹: dir 把/etc/passwd 和 /etc/group 拷贝 到 dir中 ; 备份文件夹dir 为 dir_bak ; 打包压缩文件夹 dir_bak 为 dir_bak.tar.gz ; 把dir_bak.tar.gz 复制到 / , 删除文件夹 dir
    cd
    
    mkdir dir
    
    cp /etc/passwd dir
    cp /etc/group dir
    
    cp -a dir dir_bak
    
    tar -czvf dir_bak.tar.gz dir_bak
    
    sudo cp dir_bak.tar.gz /
    
    rm -rf dir
    

    相关文章

      网友评论

        本文标题:12-Shell脚本_练习

        本文链接:https://www.haomeiwen.com/subject/dvydittx.html