zoukankan      html  css  js  c++  java
  • shell中变量定义及应用-- (环境变量及普通变量)

    shell中变量定义及应用

    1. 自定义环境变量

    1.1 设置环境变量

    如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,具体设置见下文的示例。其实,除了export命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要在变量名前面加$)。

    export命令和declare命令的格式如下:

    1.export 变量名=value
    2.变量名=value;export 变量名
    3.declare -x 变量名=value
    
    • 范例:定义环境变量并赋值
    export NAME=oldboy
    declare -x NAME=oldboy
    NAME=oldboy;export
    ------------------------------------
    [root@zabbix ~]# tail -1 /etc/profile
    export OLDBOY='oldboy'
    [root@zabbix ~]# source /etc/profile
    [root@zabbix ~]# echo $OLDBOY
    oldboy
    [root@zabbix ~]# env|grep OLDBOY
    OLDBOY=oldboy
    

    1.2 让环境变量永久生效的常用设置文件

    • (1)用户的环境变量配置

    对于用户的环境变量设置,比较常见的是用户家目录下的.bashrc和.bash_profile。

    [root@zabbix ~]# ll /root/.bashrc  -- 推荐使用
    -rw-r--r--. 1 root root 176 Dec 29  2013 /root/.bashrc
    [root@zabbix ~]# ll /root/.bash_profile 
    -rw-r--r--. 1 root root 176 Dec 29  2013 /root/.bash_profile
    
    • (2)全局环境变量的配置
    /etc/profile
    /etc/bashrc   -- 推荐使用
    /etc/profile.d/
    ## 若要在登录后初始化或显示加载内容,则把脚本文件放在/etc/profile.d/下即可(无须加执行权限)。
    
    • (3)设置登录提示的两种方式

      • 在/etc/motd中增加提示内容
      [root@zabbix ~]# cat /etc/motd 
      welcome to moox linux shell training.
      
      • 在/etc/profile.d/目录下增加脚本文件
      [root@zabbix ~]# cat /etc/profile.d/moox.sh 
      echo "Here is moox shell training."
      

    1.3 显示与取消环境变量

    • 1.通过echo或printf命令打印环境变量
    [root@zabbix ~]# echo $SHELL
    /bin/bash
    [root@zabbix ~]# printf "$SHELL"
    /bin/bash[root@zabbix ~]# 
    [root@zabbix ~]#printf "$SHELL
    "
    /bin/bash
    
    • 2.用env或set显示默认的环境变量
    • 3.用unset消除本地变量和环境变量
    [root@zabbix ~]# echo $OLDBOY
    oldboy
    [root@zabbix ~]# unset OLDBOY 
    [root@zabbix ~]# echo $OLDBOY
    
    [root@zabbix ~]# 
    
      1. 环境变量初始化与对应文件的生效顺序
    1.用户登录系统后首先会加载`/etc/profile`全局环境变量文件
    2.当加载完/etc/profile文件后,才会执行`/etc/profile.d`目录下的脚本文件
    3.之后开始运行`$HOME/.bash_profile`
    4.在$HOME/.bash_profile这个文件中,又会去找`$HOME/.bashrc`
    5.在$HOME/.bashrc文件中又会去找`/etc/bashrc`
    

    2.普通变量

    2.1 定义本地变量

    • 1.普通变量定义
    变量名=value
    变量名='value'
    变量名="value"
    
    • 2.在Shell中定义变量名

    变量名一般是由字母、数字、下划线组成的,可以以字母或下划线开头.如:moox、moox123、moox_shell

    • 3.连续的普通变量的定义及输出
    a=192.168.1.1
    b='192.168.1.1'
    c="192.168.1.1"
    echo "a=$a"
    echo "b=$b"
    echo "c1=${c},c2=$c"
    # $变量名表示输出变量,可以用$c和${c}两种用法
    
    • 4.非连续普通变量定义及输出
    a=192.168.1.1-$a
    b='192.168.1.1-$a'
    c="192.168.1.1-$a"
    echo "a=$a"
    echo "b=$b"
    echo "c1=${c}"
    

    总结:>
    数字内容的变量定义可以不加引号,
    其他没有特别要求的字符串等定义最好都加上双引号,
    如果真的需要原样输出就加单引号,
    定义变量加双引号是最常见的使用场景.

    • 5.把一个命令的结果作为变量的内容赋值

    反引号``和$()方法

    [root@zabbix ~]# moox=`pwd`
    [root@zabbix ~]# echo $moox
    /root
    [root@zabbix ~]# moox1=$(pwd)
    [root@zabbix ~]# echo $moox1
    /root
    

    3. 范例

    3.1 按天打包网站站点目录

    要求: 按天打包网站的站点目录程序,生成不同的文件名(此为企业实战案例)。

    tar zcvf scripts_$(date +%F).tar.gz /server/scripts/
    

    4.经验小结

    4.1常规普通变量定义

    • 若变量内容为连续的数字或字符串,赋值时,变量内容两边可以不加引号,例如a=123。
    • 变量的内容很多时,如果有空格且希望解析内容中的变量,就加双引号,例如a="/etc/rc.local (USER" ,此时输出变量会对内容中的)USER进行解析然后再输出。
    • 希望原样输出变量中的内容时就用单引号引起内容进行赋值,例如:a='$USER'。希望变量的内容是命令的解析结果的定义及赋值如下:
    • 要使用反引号将赋值的命令括起来,例如:a=ls;或者用(()括起来,例如:a=)(ls)。变量的输出方法如下:
    • 使用“$变量名”即可输出变量的内容,常用“echo $变量名”的方式,也可用printf代替echo输出更复杂的格式内容。

    4.2变量定义的技巧及注意事项

    • 注意命令变量内容前后的反引号字符(此字符为键盘Tab键上面的那个反引号,不是单引号),例如:“CMD=ls”。
    • 在变量名前加(可以取得该变量的值,使用echo或printf命令可以显示变量的值,)A和${A}的写法不同,但效果是一样的。
    • 用echo等命令输出变量的时候,也可用单引号、双引号、反引号,例如:echo(A、echo ")A"、echo '$A',它们的用法和前面变量内容定义的总结是一致的。
    • (dbname_tname,当变量后面连接有其他字符的时候,必须给变量加上大括号{},例如:)dbname_tname就要改成${dbname}_tname。

    5.变量在awk中的特殊使用方式

    5.1 使用awk调用Shell中不带引用命令的变量

    [root@zabbix ~]# ETT=123
    [root@zabbix ~]# awk 'BEGIN {print $ETT}'   -- 无输出结果
    
    [root@zabbix ~]# awk 'BEGIN {print "$ETT"}'	-- 输出原变量
    $ETT
    [root@zabbix ~]# awk 'BEGIN {print '$ETT'}'	-- 输出正确值
    123
    [root@zabbix ~]# awk 'BEGIN {print "'$ETT'"}'	-- 输出正确值
    123
    [root@zabbix ~]# 
    

    5.2 使用awk调用Shell中带引用命令的变量

    [root@zabbix ~]# ETT=`pwd`
    [root@zabbix ~]# awk 'BEGIN {print $ETT}'
    
    [root@zabbix ~]# awk 'BEGIN {print "$ETT"}'
    $ETT
    [root@zabbix ~]# awk 'BEGIN {print '$ETT'}'	--- 报错
    awk: cmd. line:1: BEGIN {print /root}
    awk: cmd. line:1:               ^ unterminated regexp
    awk: cmd. line:1: BEGIN {print /root}
    awk: cmd. line:1:                    ^ unexpected newline or end of string
    [root@zabbix ~]# awk 'BEGIN {print "'$ETT'"}'	--- 正常输出
    /root
    

    5.3 awk调用shell变量测试结果

    awk ETT ETT=123 ETT='oldgirl' ETT="tingting" ETT=pwd反引号
    awk 'BEGIN {print "$ETT"}' -- 加双引号 输出本身 输出本身 输出本身 输出本身
    awk 'BEGIN {print $ETT}' -- 不加引号
    awk 'BEGIN {print '$ETT'}' -- 加单引号 正确输出 语法错
    awk 'BEGIN {print " '$ETT' "}' -- 加双引号 正确输出 正确输出 正确输出 正确输出
    • 结论:

      awk 与一般情况恰好相反,不管变量如何定义、赋值,除了加单引号以外,利用awk直接获取变量的输出,结果都是一样的,因此,在awk取用Shell变量时,我们更多地还是喜欢先用echo加符号输出变量,然后通过管道给awk,进而控制变量的输出结果。这就符合前面给出的普通情况的结论了

    ETT="oldgirl"或ETT='oldgirl' 或 ETT=oldgirl 或 ETT=`pwd`
    echo $ETT|awk '{print $0}'
    

    6.总结

    关于自定义普通字符串变量的建议

    • 1)内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号,例如:
    OldboyAge=33
    NETWORKING=yes
    
    • 没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时,例如:
    NFSD_MODULE="no load"
    MyName="Oldboy is a handsome boy."
    
    • 当变量里的内容需要原样输出时,要用单引号(' '),这样的需求极少,例如:
    OLABOY_NAME='OLDBOY'
    
  • 相关阅读:
    寒假作业1
    自我介绍
    我罗斯方块1
    我罗斯方块
    解题报告 数学2
    解题报告 转化模式
    解题报告 数学
    经典语录
    解题报告 Trick
    解题报告 帮忙
  • 原文地址:https://www.cnblogs.com/moox/p/12822854.html
Copyright © 2011-2022 走看看