zoukankan      html  css  js  c++  java
  • SHELL变量

     
     
     
    一. 类型:环境变量(全局变量)和局部变量
     
    环境变量用于定义shell的运行环境,保证shell命令的正确执行。环境变量可以在命令行中设置,但重启失效,所以最好定义在用户家目录下的.bash_profile文件中或者全局配置文件/etc/profile,/etc/bashrc;也可以定义在/etc/profile.d中,这样每次用户登录的时候,这些变量都会被初始化。
     
    例如,在用户家目录下的.bash_profile文件中定义有如下变量
     
    1. 变量$PS1,它表示用户的登录信息
    [root@localhost ~]# echo $PS1
    [u@h W]$
    其中u:表示用户名,h:主机名,W:初始路径位置,$:使用的解释器。可以在.bash_profile,或者.bash_rc中改一下试试看。
     
    2. HISTFILESIZE和HISTSIZE表示历史记录的显示数;
     
    3. TMOUT表示不做操作默认时间自动做退出操作,这俩可用来做优化
     
     
     
    二. 设置环境变量
     
    1. 命令env可用来查看默认的环境变量
    unset可以取消环境变量,例如unset PS1取消这个环境变量后,echo $PS1就没内容了,但这个是临时生效的,想永久生效,还是要在配置文件中搞。
    /etc/init.d/functions:系统的函数库,没事仔细研究下每一行
     
    2. 普通字符串变量定义的方法有三种,变量名没啥要求
    1)变量名=value;(简单值就用这个)  
    直接定义变量内容,内容一般为简单连续的数字,字符串,路径名等
      
    2)变量名='value' ;
    通过单引号定义的变量,引号里是什么就输出什么,即使内容中有变量也会把变量名原样输出,不会输出变量值。
     
    3)变量名="value"  
    适合于字符串中有其他变量的情况,输出变量时引号里的其他变量会输出其值。
     
     
    3. 在/etc/profile文件中设置,搞完后记得用source /etc/profile使修改生效
    给变量赋值后使用export命令就可以设置环境变量了         例如 export oldboy="i am oldboy"就可以了。#记住这一个方法就好
     
     
    4. 把命令定义为变量
    例如:cmd=`date +%F`    或者 cmd=$(date +%F)----貌似这种方法好些,注意+和%号之间是没空格的
              调用变量如下:
              echo $cmd 或者 echo ${cmd}
              最好养成习惯用 echo "$cmd" 或者 echo "${cmd}"
     
     
     
    三. 特殊变量
     
    1. 位置变量,查看系统 more /etc/init.d/tomcat文件加深这几个变量的理解,比如$0 stop就相当于执行/etc/init.d/tomcat stop
     
    $0:获取当前执行shell脚本的文件名,包括路径
    $n:获取当前执行shell脚本的第n个参数,n=1...9,如果n>9,用大括号括起来,如${10}。 sh n.sh 张三 李四,  $1就等于张三,$2等于李四
           试试seq 9 | sed 's#[0-9]#$&#g'  和 seq -s " " 10 (将空格作为分隔符,依次输出10个数字)
    $*:获取当前shell的所有参数,将所有的命令行参数看作一个字符串,相当于“$1$2$3.....” 
    $#:获取当前shell命令行中参数的总个数
    $@:表示这个shell中的所有参数 "$1" "$2”"$3" ".....",这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数中的任何空白
     
     
    2. 进程状态变量
    $$ :获取当前shell的进程号(PID)
    $! :执行上一个指定的PID
    $?:获取执行上一个执行的返回值(0为执行成功,非0为失败),下图例子中[ $RETVAL -eq 0 ]是一个判断语句,后面的&&表示,前面的命令执行成功后接着执行后面的命令

    $_   表示在此之前执行的命令或脚本的最后一个参数 

    来个例子,脚本如下,然后执行sh all.sh a b c,观察结果。 

     

    小技巧
    > /dev/null表示把标准输出重定向到/dev/null
    >&/dev/null表示把标准和错误输出重定向到/dev/null
     
     
     
     
    四. shell变量的子串应用技术实践
     

     

    例1. MONKEY="it is a monkey"  ;echo ${#MONKEY}   输出为14
     
    例2. 截取MONKEY变量,从字符串的第2个字符之后开始取值,默认取后面全部字符值
    echo ${OLDBOY:2}  输出为is a monkey
     
    例3. 截取MONKEY变量字符串,从第2个字符之后开始取,并且只取2个字符
    echo ${MONKEY:2:2}  输出为is
     
    例4. 从变量开头开始,删除最短匹配“it is" 子串
    echo ${MONKEY#it is}   输出为a monkey    
    注意:#两边不能有空格
     
    例5. 从变量开头开始删除最长匹配”it is a“子串
    echo ${MONKEY##it is a}    
     
    例6. 从变量结尾开始删除最短匹配monkey子串
    echo ${MONKEY%monkey}
     
    例7. 从变量结尾开始删除最长匹配key子串
    echo ${MONKEY%%key}
     
    例8. 使用dog代替变量第一个匹配的monkey字符
    echo ${MONKEY/monkey/dog}
     
    例9. 使用dog代替从变量MONKEY结尾开始匹配的monkey字符串
    echo ${MONKEY/%monkey/dog}
     
    例10. 使用he is字符串,来代替变量开头匹配的It is 字符串
    echo ${MONKEY/#it is/he is}
     
    注意:统一规律,#表示从开头开始,%表示从结尾开始
     
     
     
    五. shell变量替换技术实战
     

     

    例1,${value:-word}    当变量未定义或者值为空时,返回值为word内容,否则返回变量的值

    result=${test:-UNSET}; echo $result   输出为UNSET      echo $test 输出为空

    结论:当test变量没内容时,就返回后面的UNSET值

     

    给test定义一个值,test='math'

    result=${test:-UNSET}

    echo $result,输出为math

    结论:test变量有内容时,就返回test变量的值

     

    例2,${value:=word},使用unset清空上面变量的值,使result和test的值都为空,然后做如下操作

    result=${test:=UNSET}

    echo $result;输出为UNSET,

    echo $test;输出为UNSET

    test变量为空,则输出word值,并且把word赋值给test,这个变量功能可以解决变量没有定义的问题,确保变量始终有值。

     

    给test赋值,test=math

    result=${test:=UNSET}

    echo $result,输出为math

    echo $test,输出为math

    test变量存在且非空,则输出test变量

     

     例3. ${value:?"word"}
    如果value未定义,echo ${value:?"not defined"}
    输出为-bash: value: not defined
     
    value=1
    echo ${value:?"not defined"}
    输出为1
     
    此功能可用于捕捉由于变量未定义而导致的错误
     
     
    例4,${value:+word}
    如果value值存在且非空,那么返回word的值,否则,返回值为空
    未定义value时
    r=${value:+1}; echo $r    返回值为空
     
    定义value,value=apple
    echo $r,输出为1
     
    此功能用于测试变量是否存在。
     
     
    例5.  ${value-word} 去掉冒号的情况
    httpd=${HTTPD-/usr/sbin/httpd}
    pidfile=${PIDFILE-/var/run/httpd.pid}
    echo $httpd $pidfile
    输出为/usr/sbin/httpd /var/run/httpd.pid
    echo $HTTPD $PIDFILE
    输出为空
     
    结论:变量没定义就用”-“后面的值代替
     
     
     
     
     
  • 相关阅读:
    android ndk通过遍历和删除文件
    SVN提交忽略*.class、.classpath、.mymetadata、.project、.settings、.myeclipse和其他非版本控制文件
    JDBC加载过程
    JVMTI 中间JNI系列功能,线程安全和故障排除技巧
    【Python】Python与文本处理langid工具包的文本语言检测和歧视
    SQL 存储过程 分页
    Android:仿手机QQ朋友动态ListView
    再说Java EE
    辛星与您解读PHP页面跳转的几种实现方式
    VS2010 使用TeeChart画图控件
  • 原文地址:https://www.cnblogs.com/regit/p/8044195.html
Copyright © 2011-2022 走看看