zoukankan      html  css  js  c++  java
  • shell-的变量-局部变量

      

    1. 定义本地变量
      本地变量在用户当前的shell生产期的脚本中使用。例如,本地变量OLDBOY取值为ett098,这个值只在用户当前shell生存期中有意义。如果在shell中启动另一个进程或退出,本地变量OLDBOY值将无效。
      1. 普通字符串变量定义
      变量名=value
      变量名='value'
      变量名="value"
      shell中变量名的要求:一般是字母,数字,下划线组成。字母要开头,字母大写
      oldboy,oldboy123,oldboy_training
      例子:下面的例子会输出什么结果。

    [root@yanwei-test1 scripts]# cat abctest.sh 
    a=192.168.1.2
    b='192.168.1.2'
    c="192.168.1.2"
    echo "a=$a"
    echo "b=$b"
    echo "c=${c}"
    提示:
    	1) $c 和{c} 在这里等同。
    需要在命令行实践以上内容。

      思考:想一想a,b,c各是什么结果?
    答案:
      a=192.168.1.2
      b=192.168.1.2
      c=192.168.1.2
       例2:想一想a,b,c各种事什么结果

    a=192.168.1.2-$a
    b='192.168.1.2-$a'
    c="192.168.1.2-$a"
    echo "a=$a"
    echo "b=$b"
    echo "c=${c}"
    提示:
    需要在命令行实践以上内容。

      思考:在想一想a,b,c现在各是什么结果?为什么是这个结果?
      答案:
      a=192.168.1.2-192.168.1.2
      b=192.168.1.2-$a
      c=192.168.1.2-192.168.1.2-192.168.1.2
      提示:
      第一种定义a变量的方式是直接定义变量内容,内容一般为简单连续的数字、字符串、路劲名等。
      第二种定义b变量的方式是通过单引号定义变量。这个方式的特点是:输出变量时引号里是什么就输出什么,即使内容中有变量也会把变量名原样输出。此法比较适合于定义显示纯字符串。
      第三种定义c变量方式是通过双引号定义变量。这个方式的特点是:输出变量时引号里的变量会经过解析后输出该变量内容,而不是把引号中变量名原样输出,适合于字符串中附带有变量的内容的定义。
      习惯:数字不加引号,其他默认加双引号。

    2. 定义变量单引号、双引号与不加引号
      1. 有关单引号、双引号与不加引号的简要说明如下:
      单引号
        可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么
      双引号
        把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。
      无引号
        把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以不加任何引号,不过最好用双引号替代之。
      2. 单引号、双引号与不加引号实践演示
      范例1:经过反引号的`date`命令测试

    [root@1-241 ~]# echo '`date`'
    `date`
    #单引号时看到啥就显示啥
    [root@1-241 ~]# echo "`date`"
    2017年 09月 14日 星期四 02:58:51 CST
    #双引号时如果里面是变量,会先把变量解析成具体内容在显示
    [root@1-241 ~]# echo `date`
    2017年 09月 14日 星期四 02:58:59 CST
    #对于连续的字符串等内容一般不加引号也可,加双引号一般比较保险,推荐
    

       范例2:变量定义后,调用时测试

    [root@1-241 ~]# OLDBOY=testchars       #创建一个不带引号的变量
    [root@1-241 ~]# echo $OLDBOY        #不加引号,显示一个变量解析后的内容
    testchars
    [root@1-241 ~]# echo '$OLDBOY'     #单引号,显示一个变量本身
    $OLDBOY
    [root@1-241 ~]# echo "$OLDBOY"   #双引号,显示一个变量内容,引号内可以是变量、字符串等
    testchars
    

     范例3:grep过滤字符串例子

    [root@1-241 ~]# cat grep.log 
    testchars
    oldboy
    [root@1-241 ~]# grep "$OLDBOY" grep.log
    testchars
    [root@1-241 ~]# grep '$OLDBOY' grep.log
    [root@1-241 ~]# grep $OLDBOY grep.log
    Testchars
    过滤双引号测试
    [root@1-241 ~]# cat > oldboy.log
    "
    [root@1-241 ~]# vim oldboy.log 
    [root@1-241 ~]# cat oldboy.log 
    "
    
    [root@1-241 ~]# grep '"' oldboy.log 
    "
    特殊例子:awk调用shell变量引号例子
    [root@1-241 ~]# ETT=123
    [root@1-241 ~]# awk 'BEGIN {print '$ETT'}'
    123
    [root@1-241 ~]# awk 'BEGIN {print "$ETT"}'
    $ETT
    

      提示:以上的结果正好的前面的结论相反,这是awk调用shell变量的特殊用法。
    3. 自定义变量的建议:
      1. 存数字(不带空格),定义方式可以不加引号(单或双),例如:

    a.0ldboyAge=33
    b.NETWORKING=yes
    

      2. 没特殊情况,字符串一般用双引号定义,特别是多个字符串中间有空格时,例如:

    a.NFSD_MODULE="yes  oldboy"
    b.MyName="Oldboy is a handsome "
    

     3. 变量内容需要原样输出时,要用单引用('')。

     a.0ldboyAge='$OLDBOY' 

    4. 变量的命名规范
      1. 变量命名要统一,使用全部大写字母,如APACHE_ERR_NUM;语义要清晰,能够正确表达变量内容的含义,过长的英文单词可采用前几个字符代替。多个单词连接使用“_”号连接,引用时,最好以${APACHE ERR NUM}加大括号或"${APACHE ERR NUM}"外面加双引号方式引用变量;
      2. 避免无含义字符或数字:例如下面的count,并不知道其确切含义;

      范例1:COUNT的不确切定义

    COUNT=`grep keywords file`
    	if [  $COUNT -ne  22  ]
    	       then
    		echo 'Do  Something'
    fi
    

      3. 全局变量和局部变量命名

      1) 脚本中的全局变量定义,如OLDBOY_HOME或OLDBOYHOME,在变量使用时使用{}将变量扩起或"{OLDBOY_HOME}"

    [yanwei@yw-07 ~]$ cat /etc/init.d/functions 
    # -*-Shell-script-*-
    #
    # functions This file contains functions to be used by most or all
    #       shell scripts in the /etc/init.d directory.
    #
    
    TEXTDOMAIN=initscripts
    
    # Make sure umask is sane
    umask 022
    
    # Set up a default search path.
    PATH="/sbin:/usr/sbin:/bin:/usr/bin"
    export PATH
    

        2) 脚本中局部变量定义:存在于脚本函数(function)中的变量称为局部变量,要以local方式进行声明,使之只在函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成程序异常。下面是函数中的变量定义例子:

      

    #!/bin/bash
    #author: zhansan
    #Email: zhansan@163.com
    #date:2018/4/10
    #content:infra install 236
    
    
    JENKINS_DIR=/api/236/batch/
    YW_DIR=/appl/yanwei-batch
    API_IP=(yanwei-09 yanwei-10)
    
    
    for IP in ${API_IP[*]} 
    do
    API_process=`ssh  ${IP} "ps -ef |grep java |grep -v grep |grep yanwei-platform-batch |wc -l"`
    JUDGE_DIR=`ssh  ${IP} " [ -d /appl/yanwei-batch ]" && echo yes ||echo no`
    FREE="-Xms512m -Xmx1g -Xss512k"
    JAVA="/usr/bin/java  ${FREE} -jar"
    if [ "$API_process" -eq 7 ]
    	then
         ssh  ${IP} "ps -aux|grep -v grep |grep yanwei-platform-batch |awk '{print $2}'|xargs kill -9"
    
    fi
    

      3) 变量合并:当某些变量或配置项要组合起来才有意义时,如文件的路径和文件名称,建议将要组合的变量合并到一起赋值给一个新的变量,这样既方便之后的调用,也为以后进行修改提供了方便。

    范例3:使用java的方便
    FREE="-Xms512m -Xmx1g -Xss512k"
    JAVA="/usr/bin/java  ${FREE} -jar
    

     4) 变量定义总结:多学习模仿操作系统自带的/etc/init.d/functions函数库脚本的定义思路。

      1.把一个命令定义为一个变量

    [root@1-241 ~]# ls
    anaconda-ks.cfg  grep.log  install.log  install.log.syslog  oldboy.log  tools
    [root@1-241 ~]# CMD=`ls`
    [root@1-241 ~]# echo $CMD
    anaconda-ks.cfg grep.log install.log install.log.syslog oldboy.log tools
    [root@1-241 ~]# CMD1=$(pwd)
    [root@1-241 ~]# echo $CMD1
    /root
    

      提示:
      1) “CMD=ls”注意命令变量前后的字符``(为键盘tab建上面的哪个,不是单引号)
      2) 在变量名前加$,可以取的此变量的值,使用echo命令可以显示变量的值,$A和${A}的写法不同,但功能是一样的,推荐使用后者的语法或"${A}"的写法不同,但功能是一样的,推荐使用后者的语法或“${A}”的用法。
      3) ${WEEK}day若变量和其他字符组成新的变量就必须给变量加上大括号{}。
      4) *养成将所有字符串变量用双引号括起来使用的习惯,将会减少很多编程时遇到的怪异的错误。具体使用方法如:“$A”或"${A}"的用法。

       5) 生产环境常见应用:

    1.对站点按天打包生成不同的文件名。
    [root@1-241 ~]# CMD=$(date +%F)
    [root@1-241 ~]# echo $CMD
    2017-09-14
    [root@1-241 ~]# echo `date +%F`.tar.gz
    2017-09-14.tar.gz
    [root@1-241 ~]# echo ${CMD}.tar.gz
    2017-09-14.tar.gz
    

      

     

  • 相关阅读:
    不要再胡思乱想了
    sqoop和mysql之间导出问题
    reids3.0安装文档
    java面试
    java面试2
    大数据面试题 ---阿善有用
    rdd-api整理
    RDD弹性分布式数据集特性总结
    spark-on-yarn配置参数
    资源调度
  • 原文地址:https://www.cnblogs.com/scajy/p/12762251.html
Copyright © 2011-2022 走看看