您当前的位置:主页 > 技术探讨 >

shell脚本基础(二)

发布时间:2017-02-25 19:39编辑:admin阅读(

    今天的内容比较接近应用层次,通过相关命令可以写出我们想要的效果,想要查看更多的嵌入式内容可以到我的简书中查看更多的文章。
    作业
    1.写一个命令求阶乘或是求和,比如说命令运行:
    ./xx.sh 6! 如果是这样运行就执行阶乘6x5x4x3x2x1
    ./xx.sh 6+ 如果是这样运行就执行阶乘6+5+4+3+2+1
    //下面是老师给我们留的不正确的答案,可能是老师觉得问题较简单,并没有正面解决这个问题,百度上有求阶乘或是求和的答案
    arg1=$1
    if [ $# != 1 ]
    then
    echo "参数过多或过少!!!"
    else
    arglength=${#arg1}
    let start=arglength-1
    op=${arg1:start:1}
    num=${arg1:0:start}
    case $op in
    "+")
    sum=0
    i=1
    while [ $i -le $num ]
    do
    let sum=sum+i
    let i++
    done
    echo "sum=${sum}"
    ;;
    "!")
    result=1
    i=1
    while [ $i -le $num ]
    do
    let result=result*i
    let i++
    done
    echo "result=${result}"
    ;;
    "*")
    echo "usage:./xx.sh 6+  or  ./xx.sh 6!"
    ;;
    esac
    fi

    3.使用while循环打印如图所示的直角三角形

    *
    **
    ***
    ****
    *****
    ******
    row=1
    colum=1
    while [ $row -le 6 ]
    do
    colum=1
    while [ $colum -le $row ]
    do
    printf "*"
    let colum++
    done
    printf "\n"
    let row++
    done

    4.打印乘法表
    row=1
    colum=1
    while [ $row -le 9 ]
    do
    colum=1
    while [ $colum -le $row ]
    do
    printf "%dx%d=%-2d" ${colum} ${row} $((colum*row))
    let colum++
    done
    printf "\n"
    let row++
    done

    5.创建当天文件夹
    year=`date +%Y`
    mouth=`date +%m`
    day=`date +%d`
    arg1=$1
    if [ $# -eq 0 ]
    then
    mkdir -p ~/practice/$year/$mouth/$day
    echo "${year}文件创建完成!!!"
    cd ~/practice/$year/$mouth/$day
    elif [ $# -eq 1 ]
    then
    case $arg1 in
    "y")
    mkdir -p ~/practice/$year/$mouth/$day
    echo "${year}文件创建完成!!!"
    cd ~/practice/$year
    ;;
    "m")
    mkdir -p ~/practice/$year/$mouth
    echo "${mouth}文件创建完成!!!"
    cd ~/practice/$year/$mouth
    ;;
    "d")
    mkdir -p ~/practice/$year/$mouth/$day
    echo "${day}文件创建完成!!!"
    cd ~/practice/$year/$mouth/$day
    ;;
    "*")
    echo "用法"
    echo "1>-y:产生当年文件夹"
    echo "2>-m:产生当月文件夹"
    echo "3>-d:产生当日文件夹"
    ;;
    esac
    else
    echo "用法"
    echo "1>-y:产生当年文件夹"
    echo "2>-m:产生当月文件夹"
    echo "3>-d:产生当日文件夹"
    fi

    16、数组
    1>数组是保存多个变量的一个集合
    2>数组的定义
    1 array={1 2 3 4 5}

    4array1[0]=2
    5array1[1]=3
    6array1[2]=5
    7array1[3]="hello"
    9echo "${array1[*]}"
    3>数组的输出
    2echo "${array[@]}"
    3echo "${array[*]}"
    4>数组元素的访问
    ${array[下标]}
    下标的范围:0~数组的大小-1
    数组元素访问越界,默认值为空
    注意点:数组定义可以隔开定义,最好从0开始
    17、shell函数
    1>什么是函数
    函数就是一个包,包代码
    案例入门:
    1func()
    2{
    3    i=0
    4    while [ $i -le 9 ]
    5    do
    6       printf "=====\n"
    7       let i++
    8    done
    9}
    10func
    2>函数存在的意义
    1)方便管理,提高代码的重复使用
    2)模块性,功能性,提高以后的工作效率
    3>函数格式
    [functino]functinoname()       \\[function]可有可无
    {
    语句体
    }
    4>函数调用
    functionname
    5>return的作用
    1)return代表结束函数的运行,return下面的函数不会被执行
    2)将return后面的值返回出去
    注意点:return  num出来的值num只能在0-255之间,如果num大于255,那么实际return的结果是num%256;
    实在需要返回一个num大于255,用echo,如果想要接受一个echo出来的值,使用``或$()
    6>$?的作用
    $?是接收最后运行的一个函数返回出来的结果
    7>函数接收变量的值
    函数内部
    $0:./xx.sh
    $1:代表函数后面的第一个参数
    $2:代表函数后面的第二个参数
    ···
    $n:代表函数后面的第n个参数
    当n>=10时,就写为${n}
    $#:代表函数后面的参数个数
    函数外部
    $0:./xx.sh
    $1:代表xx.sh后面的第一个参数
    $2:代表xx.sh后面的第二个参数
    ···
    $n:代表xx.sh后面的第n个参数
    $#:代表命令后面的参数个数
    8>函数定义注意点
    1)函数内部可以定义函数
    2)条件函数根据具体的条件定义
    3)怎么保证函数一定调用成功
    只要能够保证函数调用之前,只要有这个函数的定义就可以了
    unset num:清空
    9>如果没有指明某个变量的作用域,那么他的作用域全局的,所有我们一般情况下,如果不希望外面拿到函数内部的值,我们指明这个函数的作用域,用local修饰,代表这个变量只能在这个函数内部使用
    作业:
    自己写一个mycal命令,最好使用函数
    1>mycal,出现当年当月的函数
    2>mycal 2016.6出现的2016.6月的日历
    3>mycal 2016,显示整年
    已知条件
    1>1990.1.1是星期一
    2>闰年的条件
       1)能被4整除,且不能被100整除
        或者
       2)能被400整除