美文网首页
shell脚本编写

shell脚本编写

作者: 是立品啊 | 来源:发表于2020-07-16 22:03 被阅读0次

    shell脚本格式

    #! /bin/bash
    # author :jack
    # date: 2020-5-20
    # for study
    .........
    
    • 文件首行指定执行shell的程序以及相关说明
    • shell 脚本文件后缀,建议命名为.sh
    • 脚本执行失败时,使用exit返回非零值,来退出程序
    • 默认缩进4个空格
    • shell脚本的命名简单,有意义

    注释

    单行注释

    #
    

    多行注释

    :<<!
    这是注释
    !
    

    案例

    vim userinfo.sh
    
    
    #! /bin/bash
    # author :jack
    # date: 2020-5-20
    # for study
    
    echo "$(cat /etc/passwd)"
    
    • 退出vim esc :x

    执行脚本

    bash userinfo.sh
    

    sh userinfo.sh
    

    ./userinfo.sh (没有权限的情况下,chmod +x userinfo.sh) #./之间没有空格
    

    函数

    • 格式
    function 函数名()
    {
        命令1
        命令2
        命令3
        .....
    }
    
    • function关键字可省略,如果省略function()不能省
    • 没有参数的情况下,也可以省略括号
    function hello {
        echo "hello,Jack"
    }
    
    hello #调用函数
    
    • 调用函数,直接函数名

    案例1:

    greet(){
      echo "hello ${LOGNAME}, today is $(date)"
      echo "hello ${LOGNAME}, \n today is $(date)"
      echo -e "hello ${LOGNAME}, \n today is $(date)"
    }
    
    greet # 调用函数
    
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    hello root, today is 2020年 05月 31日 星期日 00:08:04 CST
    hello root, \n today is 2020年 05月 31日 星期日 00:08:04 CST
    hello root,
     today is 2020年 05月 31日 星期日 00:08:04 CST
    
    • ${}引用变量
      -$()引用命令结果
    • echo-e 才转义\n

    案例2

    read -p "请输入你的姓名: " name     #$ REPLY
    read -p "请输入你的年龄:" age
    
    function info() {
        echo -e "你的姓名:${name} \n 你的年龄:${age}"
    }
    
    info
    
    • read 读取用户输入,赋值给name,如果不用name接收,默认赋值给 REPLY

    案例3

    function info {
        echo -e "你的姓名:$1 \n 你的年龄:$2"
    }
    
    info "土豆" 18
    
    • 函数内部的$1,$2接收函数调用时候的实参

    案例4

    read -p "请输入你的姓名: " name
    read -p "请输入你的年龄:" age
    #
    function info() {
        echo -e "你的姓名:$1 \n 你的年龄:$2"
    }
    
    info "${name} " "${age}"
    
    • shell中参数名不能自定义,1,2
    • shell函数不需要写形参
    • 传参过程


      image.png

    案例5

    function info() {
        echo -e "你的姓名:$1 \n 你的年龄:$2"
    }
    
    info $1 $2
    
    • 函数调用时的$1,$2,是命令行传入的值,与函数内部的$1,$2 不一样

    流程控制

    if

    if [ 条件1 ]
    then
        指令
    elif [ 条件2 ]
    then
        指令2
    else
        指令3
    fi            
    
    read -p "请输入你的年龄"
    if [ ${REPLY} -gt 70 ];then echo "回家锻炼身体吧"
    elif [ ${REPLY} -gt 18 ]; then echo "热烈欢迎"
    else echo "回家写作业"
    
    fi
    

    for

    • 格式1:
    for 值 in 列表
    do
        执行语句
    done
    
    • 格式2:
    max=10
    for ((i=1;i<=max;i++))
    do
        echo "${i}"
    done    
    
    • 案例
    for i in $(ls /) ; do
        echo "dir:${i}"
    done
    
    dir=$(ls /)
    index=1
    for i in  ${dir}
    do
        echo "第${index}个文件:${i}"
        index=$((index+1))
    done
    
    n=10
    for (( i = 0; i < n; i++ )); do
    
        echo ${i}
    done
    

    while

    • 只要满足条件就会一直执行
    while [ 条件 ]
    do
        执行语句
    done    
    
    • 案例
    read -p "输入数字" a
    
    while [ "${a}" -lt 20 ]
    do
      echo "${a}"
      a=$((a+1))
    
    done
    

    until

    • 只要条件不满足,就一直循环
    until 条件
    do
        执行语句
    done 
    

    case

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    
    if [ ! "$#" -eq 3 ]; then
      echo -e "Usge: \n $0 num1 +|-|*|/ num2"
      exit 1  # 异常退出程序
    fi
    
    case $2 in
    +)
      echo "$1+$3  = $(($1+$3))"
      ;;
    -)
      echo "$1-$3  = $(($1-$3))"
      ;;
    \*)
      echo "$1*$3  = $(($1*$3))"
      ;;
    /)
      echo "$1/$3  = $(($1/$3))"
      ;;
    *)
     echo "不支持的运算符"
      ;;
    esac
    
    exit 0
    
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    
    • bash -x 脚本.sh 调试脚本

    相关文章

      网友评论

          本文标题:shell脚本编写

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