zoukankan      html  css  js  c++  java
  • Shell 的变量(转)

    变量的取用: echo

    [root@www ~]# echo $variable
    [root@www ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    [root@www ~]# echo ${PATH}

    变量的配置

    [root@www ~]# echo $myname
           <==这里并没有任何数据~因为这个变量尚未被配置!是空的!
    [root@www ~]# myname=VBird
    [root@www ~]# echo $myname
    VBird  <==出现了!因为这个变量已经被配置了!

    变量的配置守则

    1. 变量与变量内容以一个等号『=』来连结,如下所示: 
      『myname=VBird』

    2. 等号两边不能直接接空格符,如下所示为错误: 
      『myname = VBird』或『myname=VBird Tsai』

    3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
      『2myname=VBird』

    4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
      • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
        『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
      • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
        『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
    5. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

    6. 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
      『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

    7. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
      『PATH="$PATH":/home/bin』

    8. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量
      『export PATH』

    9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

    10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
      『unset myname』

    底下让鸟哥举几个例子来让你试看看,就知道怎么配置好你的变量啰!

    范例一:配置一变量 name ,且内容为 VBird
    [root@www ~]# 12name=VBird
    -bash: 12name=VBird: command not found  <==屏幕会显示错误!因为不能以数字开头!
    [root@www ~]# name = VBird            <==还是错误!因为有空白!
    [root@www ~]# name=VBird              <==OK 的啦!
    
    范例二:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时:
    [root@www ~]# name=VBird's name  
    # 单引号与双引号必须要成对,在上面的配置中仅有一个单引号,因此当你按下 enter 后,
    # 你还可以继续输入变量内容。这与我们所需要的功能不同,失败啦!
    # 记得,失败后要复原请按下 [ctrl]-c 结束!
    [root@www ~]# name="VBird's name"    <==OK 的啦!
    # 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效!
    [root@www ~]# name='VBird's name'    <==失败的啦!
    # 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了!
    [root@www ~]# name=VBird\'s\ name     <==OK 的啦!
    # 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦!
    
    范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
    [root@www ~]# PATH=$PATH:/home/dmtsai/bin
    [root@www ~]# PATH="$PATH":/home/dmtsai/bin
    [root@www ~]# PATH=${PATH}:/home/dmtsai/bin
    # 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰!
    
    范例四:承范例三,我要将 name 的内容多出 "yes" 呢?
    [root@www ~]# name=$nameyes  
    # 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!
    # 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对!
    [root@www ~]# name="$name"yes
    [root@www ~]# name=${name}yes  <==以此例较佳!
    
    范例五:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序?
    [root@www ~]# name=VBird
    [root@www ~]# bash        <==进入到所谓的子程序
    [root@www ~]# echo $name  <==子程序:再次的 echo 一下;
           <==嘿嘿!并没有刚刚配置的内容喔!
    [root@www ~]# exit        <==子程序:离开这个子程序
    [root@www ~]# export name
    [root@www ~]# bash        <==进入到所谓的子程序
    [root@www ~]# echo $name  <==子程序:在此运行!
    VBird  <==看吧!出现配置值了!
    [root@www ~]# exit        <==子程序:离开这个子程序

    在一般的状态下,父程序的自定义变量是无法在子程序内使用的。但是透过 export 将变量变成环境变量后,就能够在子程序底下应用了!

     

    反单引号

    如何进入到您目前核心的模块目录?
    [root@www ~]# cd /lib/modules/`uname -r`/kernel
    [root@www ~]# cd /lib/modules/$(uname -r)/kernel

    取消变量

    取消刚刚配置的 name 这个变量内容
    [root@www ~]# unset name

     

    单引号与双引号

    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
    [root@www ~]# name=VBird
    [root@www ~]# echo $name
    VBird
    [root@www ~]# myname="$name its me"
    [root@www ~]# echo $myname
    VBird its me
    [root@www ~]# myname='$name its me'
    [root@www ~]# echo $myname
    $name its me
    发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意

     

    变量的有效范围

    什么?变量也有使用的『范围』?没错啊~我们在上头的 export 命令说明中,就提到了这个概念了。如果在跑程序的时候,有父程序与子程序的不同程序关系时, 则『变量』可否被引用与 export 有关。被 export 后的变量,我们可以称他为『环境变量』! 环境变量可以被子程序所引用,但是其他的自定义变量内容就不会存在于子程序中。

     

    declare / typeset

    declare 或 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦! 那么 declare 还有什么语法呢?看看先:

    [root@www ~]# declare [-aixr] variable
    选项与参数:
    -a  :将后面名为 variable 的变量定义成为数组 (array) 类型
    -i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
    -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
    -r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset
    
    范例一:让变量 sum 进行 100+300+50 的加总结果
    [root@www ~]# sum=100+300+50
    [root@www ~]# echo $sum
    100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
    [root@www ~]# declare -i sum=100+300+50
    [root@www ~]# echo $sum
    450         <==瞭乎??

    由于在默认的情况底下, bash 对于变量有几个基本的定义:

    • 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;
    • bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;

    现在你晓得为啥你需要进行变量宣告了吧?如果需要非字符串类型的变量,那就得要进行变量的宣告才行啦! 底下继续来玩些其他的 declare 功能。

    范例二:将 sum 变成环境变量
    [root@www ~]# declare -x sum
    [root@www ~]# export | grep sum
    declare -ix sum="450"  <==果然出现了!包括有 i 与 x 的宣告!
    
    范例三:让 sum 变成只读属性,不可更动!
    [root@www ~]# declare -r sum
    [root@www ~]# sum=tesgting
    -bash: sum: readonly variable  <==老天爷~不能改这个变量了!
    
    范例四:让 sum 变成非环境变量的自定义变量吧!
    [root@www ~]# declare +x sum  <== 将 - 变成 + 可以进行『取消』动作
    [root@www ~]# declare -p sum  <== -p 可以单独列出变量的类型
    declare -ir sum="450" <== 看吧!只剩下 i, r 的类型,不具有 x 啰!

    declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell script 比较常用的啦! 比较有趣的是,如果你不小心将变量配置为『只读』,通常得要注销再登陆才能复原该变量的类型了!

     

    数组 (array) 变量类型

    某些时候,我们必须使用数组来宣告一些变量,这有什么好处啊?在一般人的使用上, 果然是看不出来有什么好处的!不过,如果您曾经写过程序的话,那才会比较了解数组的意义~ 数组对写数值程序的设计师来说,可是不能错过学习的重点之一哩!好!不啰唆~ 那么要如何配置数组的变量与内容呢?在 bash 里头,数组的配置方式是:

    var[index]=content

    意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 .... 等等,那个 index 就是一些数字啦,重点是用中刮号 ([ ]) 来配置的。 目前我们 bash 提供的是一维数组。老实说,如果您不必写一些复杂的程序, 那么这个数组的地方,可以先略过,等到有需要再来学习即可!因为要制作出数组, 通常与循环或者其他判断式交互使用才有比较高的存在意义!

    范例:配置上面提到的 var[1] ~ var[3] 的变量。
    [root@www ~]# var[1]="small min"
    [root@www ~]# var[2]="big min"
    [root@www ~]# var[3]="nice min"
    [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
    small min, big min, nice min

    转自 http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_2.php

  • 相关阅读:
    windows下用cmd命令netstat查看系统端口使用情况
    linux 运维知识体系
    Oracle中MD5+Base64加密实现
    MySql学习—— 查询性能优化 深入理解MySql如何执行查询
    Mysql集群和主从
    Docker搭建 oracle
    docker容器以ROOT账号登录(获取ROOT权限/ROOT密码)
    一文看懂javaGC
    Docker 国内仓库和镜像
    排序算法___堆排序
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/2737889.html
Copyright © 2011-2022 走看看