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'
    
  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/moox/p/12822854.html
Copyright © 2011-2022 走看看