zoukankan      html  css  js  c++  java
  • shell脚本编程之变量的小用法

    变量赋值

    ${parameter:-word}:如果parameter为空或未定义,则变量展开为"word";否则,展开为parameter的值;
    ${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,展开为"word"值;
    ${parameter:=word}:如果parameter为空或未定义,则变量展开为"word",并将展开后的值赋值给parameter;
    ${parameter:?word}:如果parameter为空或未定义,则显示为错误,错误信息为"word";
    ${parameter:2}:跳过parameter的前两个字符,取parameter后面的所有字符;
    ${parameter:2:3}:跳过parameter的前两个字符,从parameter的第三个字符开始往后取三个字符;
    

    示例

    [root@centos6 ~]# vim test.sh
    #!/bin/bash
    . /root/f1.txt       
    TEST=${TEST:-'hello world'}    #如果f1.txt中定义了TEST变量的值,就打印TEST值;如果f1.txt中未定义或TEST值为空,就打印后面的'hello world';
    [ -n "$TEST" ] && echo "$TEST"
    

    局部变量

    local VAR_NAME
    
    function test {
    local a=$[3+4]
    }
    在函数中定义局部变量,只在函数中有效,不影响函数外的变量;如果函数外也有同名的变量a,则函数中的变量a只在函数中有效,与函数外的变量a不冲突    
    

    mktemp的用法

    生成临时目录和文件;
    生成临时目录:-d
    /tmp/目录每隔30天会做一次清理,30天没有被访问过的将会被清理
    
    [root@localhost ~]# mktemp /tmp/file.XXXXX
    /tmp/file.eJehp
    [root@localhost ~]# mktemp /tmp/file.XXXXX
    /tmp/file.0Z7KZ
    生成随机指定字符个数后缀的文件,并且打印出文件路径
    [root@localhost ~]# FILE=`mktemp /tmp/file.XXXXX`    #把mktemp生成的临时文件和路径赋值给FILE变量
    

    信号

    kill -SIGNAL(信号) PID(进程编号)
    1:HUP;终端断线
    2:INT;中断(同 Ctrl + C)
    3:QUIT;退出(同 Ctrl + )
    9:KILL;强制终止
    15:TER;终止
    
    脚本中,可以实现信号捕捉;但9和15信号捕捉不了;如果9和15信号可以捕捉,抓到信号抛弃掉,会造成脚本终止不了;
    trap命令:bash_shell内置命令,可以实现信号捕捉;
    trap 'command' 信号列表
    
    示例1:
    [root@centos6 ~]# vim date.sh
    #!/bin/bash
    trap 'echo "You go...";exit 1' INT   #INT(2)信号等同于ctrl+c;设定信号捕捉,当捕捉到ctrl+c(2)信号时,用打印You go和exit代替2信号
    while :;do
       date
       sleep 2
    done
    [root@centos6 ~]# bash date.sh
    Wed Dec 11 20:00:42 CST 2019
    Wed Dec 11 20:00:45 CST 2019
    ^CYou go...
    
    示例2:
    [root@centos6 ~]# vim ping.sh
    #!/bin/bash
    FILE=`mktemp /tmp/file.XXXXX`    #函数外定义的变量可以用于函数中
    NET=192.168.0    
    function signal {
       echo "quit"
       rm -f $FILE
       exit 1
    }
    trap 'signal' INT   #当接收到ctrl+c(2)信号时,执行signal函数,用于代替2信号
    for i in {200..254};do
       if ping -c 1 -W 1 $NET.$i &>/dev/null;then   #ping命令会接收ctrl+c信号,所以不会退出循环
           echo "$NET.$i is up" | tee >> $FILE    #tee命令会把标准输入的内容输出到一个文件中
       else
           echo "$NET.$i is down" 
       fi
    done
  • 相关阅读:
    HDU-1115计算几何
    树形DP入门之HDU 1296
    拓扑排序-POJ1964
    其他一些数状数组的题
    HDU 2852(树状数组plus二分)
    POJ-2155二维树状数组
    HDOJ 1166 敌兵布阵 (线段树)
    codevs 1082 线段树练习3 (线段树)
    codevs 1081 线段树练习2 (线段树)
    codevs 1080 线段树练习(线段树)
  • 原文地址:https://www.cnblogs.com/dongzhanyi123/p/12024934.html
Copyright © 2011-2022 走看看