Shell编程

作者: saoraozhe3hao | 来源:发表于2018-08-02 22:18 被阅读21次
    #! /bin/bash  # 声明使用哪种shell,这里是bash
    log='haha'   # 定义变量,shell的变量是弱类型的字符串
    echo $log    # 使用变量
    echo $2      # 执行该程序时传入的第二个参数
    echo $#      # 执行该程序时传入参数的个数
    echo $?       # 上一条命令的返回状态,0 表示执行正确
    echo $$       # 当前进程ID
    for attr in $@       # $@为执行该程序时传入的参数列表
    do
        ###########      单个值       ###########
        echo `date`  # 只有一个命令
        echo $(date)  # 只有一个命令,一般用这个
        echo date    # 只有一个单词
        echo $attr     # 只有一个变量
        echo $[2#11+2]  # 只有一个表达式求值,2#11表示2进制数11,即3
    
       ###########      多个值       ###########
        # 不使用引号整体括起来
        echo $attr `date` $(date) "date" date $[1+2]
        # 双引号括起来,单引号称为普通字符
        echo "$attr `date` $(date) 'date' date $[1+2]"
        # 单引号括起来,所有字符都成为普通字符
        echo '$attr `date` $(date) "date" date $[1+2]'
        
        ###########      最佳用法       ###########
        echo 'date'          # 只有一个单词,用单括号,更好区分
        echo 'date $attr'  # 多个单词,用单括号,形成整体
        echo "date $attr"  # 多个值,用双括号,形成整体
    done
    read passwd      # 等待输入
    if [ $passwd = '123']  # 相当于if test $passwd = 123,表达式为真,则test返回状态$?为0
    then
        echo 'correct'
    else
        echo 'wrong'
    fi
    while [ !$passwd -eq '123' ]   # 循环
    do
        $passwd=$passwd+1
    done
    trap 'echo 11' INT # 接到INT信号时 执行echo 11
    function printit(){    # 函数定义
        echo ${1}     # 调用函数时,传入的第一个参数
    }
    printit 1              # 函数调用,并传入参数
    export x=1        # 把局部变量 导出为 环境变量
    case $cho in
    "yes")
        echo "yes"
        ;;
    "*")
         echo "*"
          ;;
    esac
    exit 1  # 退出,并返回一个状态
    

    变量

    查看所有变量:set
    查看环境变量:env,printenv
    查看语系:locale
    注销变量:unset log
    常用环境变量:USER,HOSTNAME,LANG,SHELL,PATH,PS1(命令提示符格式,即光标前面的串)
    追加PATH:PATH="$PATH":/目录

    信号处理

    1、发出信号
    四个等价命令:kill -s SIGTERM pid、kill -n 15 pid、kill -15 pid、kill -TREM pid
    2、信号捕获
    trap "echo 11;exit 2" INT # 处理并退出,INT 也可以替换为它的编号 2
    trap "" INT # 忽略
    trap INT # 恢复默认处理
    3、信号类型
    查看信号列表:kill -l
    HUP(1)    挂起,终端掉线或退出,前台进程将收到信号,默认终止进程
    INT(2)    中断,Ctrl+C,前台进程将收到信号,默认终止进程
    QUIT(3)   退出,Ctrl+\,前台进程将收到信号,默认CoreDump
    KILL(9)   杀死,不能被捕获
    STOP(19)   停止,不能被捕获
    STP(20)   暂停,CTRL+Z,前台进程将收到信号,默认暂停进程
    4、默认行为
    CoreDump(核心转储):当程序运行过程中异常退出时,内核把当前程序在内存状况存储在一个core文件中,以便调试
    暂停进程:查看暂停的进程 jobs,恢复暂停的进程 bg job号

    子shell

    进入子shell:bash,父shell的局部变量失效,环境变量仍然有效
    退出当前shell:exit,即回到父shell
    查看进程树,shell层次:pstree

    条件判断

    存在判断 [-e /root],文件存在判断[-f /etc/file],目录存在判断[-d /root]
    存在权限判断 [-r /etc] [-w /etc] [-x /etc]
    数值判断:等于-eq 或 =,不等于-ne 或 !=,大于-gt,大于等于-ge,小于-lt,小于等于-le
    字符串判断:为空[-z str],非空[-nstr],相同[str1 ==str2]
    多重判断:与-a,或-o,非!
    条件执行&&:命令1&&命令2,命令1执行正确,则执行命令2
    条件执行||:命令1 || 命令2,命令1执行不正确,则执行命令2

    循环

    for循环:for i in 1 2 3 4 5,for in {cat ls.log},for((i=1;i<=num;i=i+1))

    重定向

    无底洞:/dev/null
    重定向标准输出:命令 >/dev/null 或 命令 1>/dev/null,1是标准输出的文件描述符
    重定向(追加)标准输出:命令 >>/dev/null 或 命令 1>>/dev/null
    重定向标准错误:命令 2>/dev/null,命令 2>>/dev/null,2是标准错误的文件描述符
    12重定向连写:命令 &>/dev/null 或 命令 >/dev/null 2>&1
    12重定向(追加)连写:命令 &>>/dev/null 或 命令 >>/dev/null 2>&1
    2>&1:表示2的重定向目标和方式(覆盖还是追加)与1相同,也可以写成2&>1

    相关文章

      网友评论

        本文标题:Shell编程

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