天天看点

Linux之Bash基础特性变量(3)

变量

程序 = 指令(只读) + 数据(数据存储的位置变量、列表、数组)

    指令可通过位置变量调用,向脚本传递的数据

变量名 可引用的"命名的内存空间":取了名字的内存空间,用名字即可调用事先划分的内存空间

变量类型 变量内部存储的数据的类型

变量类型的作用

    限定了存储空间

    限定了存储格式

    限定了参与的运算

变量的类型

    字符型

    数值型

        整型

        浮点型

    强类型 定义变量时,必须指定变量的类型,参与的运算必须符合要求

        调用未申明的变量,会报错

    弱类型 定义变量时,不用指定变量的类型,参与运算时将自动进行隐式转换

        直接赋值,直接引用 ,默认为字符型

    var=value 表示把value值存储在var内存空间中

bash弱类型,解释型

    1、不用申明,直接引用

    2、参与运算,自动转换

变量的类型(按bash作用域划分)

    本地变量   生效范围是当前shell的生命周期,对当前shell之外的其他shell进程和当前shell的子或父进程均无效。

    环境变量   生效范围当前shell进程及其子shell进程,对其他shell无效。运行脚本时,脚本在当前shell的子shell中运行

    局部变量  生效范围为当前shell进程中,只对某个代码片段(通常指)生效

    位置变量  作用:向脚本参数,在让脚本脚本中可调用向脚本的参数 

    特殊变量   一般指的是内置变量,$?返回状态,$0返回状态, 指令可以通过位置变量调用,向脚本传递的参数

本地变量

      生效范围是当前shell的生命周期,对当前shell之外的其他shell进程和当前shell的子或父进程均无效。

1)在当前shell定义的变量,对当前shell生效(当前shell进程的生命周期内)

1

2

3

4

5

<code>[root@izpo45bh60h6bsz ~]</code><code># tty                       #当前终端</code>

<code>/dev/pts/2</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># a=3                       #在模拟终端2上定义一个本地变量</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $a                   #可以显示其变量值</code>

<code>3</code>

2)在当前shell中定义的变量,在新的shell中,不能生效

<code>[root@izpo45bh60h6bsz ~]</code><code># tty                       #另起一个shell,此时在模拟终端0上</code>

<code>/dev/pts/0</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $a                   #显示其变量的值</code>

3)当前shell的子shell进程中,变量也不会生效

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>[root@izpo45bh60h6bsz ~]</code><code># pstree                    #显示当前系统上的进程树,</code>

<code>systemd  --                                         </code><code>#systemd为当前shell的父进程</code>

<code>         </code> 

<code>         </code><code>├─sshd─┬─sshd───</code><code>bash</code><code>───pstree   </code><code># 当前shell的位置</code>

<code>        </code> 

<code>[root@izpo45bh60h6bsz ~]</code><code># bash                      #新启动一个子shell</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># pstree</code>

<code>systemd  --</code>

<code>         </code><code>├─sshd─┬─sshd───</code><code>bash</code><code>───</code><code>bash</code><code>───pstree </code><code>#当前shell为子shell</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $a                   #变量不会生效</code>

<code> </code> 

<code>[root@izpo45bh60h6bsz ~]</code><code>#     </code>

<code>[root@izpo45bh60h6bsz ~]</code><code># exit                      #退出当前shell,回到父shell</code>

<code>exit</code>

<code>systemd─</code>

<code>       </code><code>├─sshd─┬─sshd───</code><code>bash</code><code>───pstree     </code><code>#回到当前shell进程</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $a                   #变量生效  </code>

补充:

<code>[root@izpo45bh60h6bsz ~]</code><code># pidof bash  ##当前bash的Pid号码</code>

<code>11423</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $$     ##当前bash的Pid号码</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $SHLVL ##当前bash的层级</code>

<code>1</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># bash</code>

<code>defined </code><code>in</code> <code>profile.d</code><code>/welcome</code><code>.sh  全局有效Welcome 0 your home </code><code>/root</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $SHLVL  ##当前bash的层级</code>

<code>2</code>

环境变量

    生效范围当前shell进程及其子shell进程,对其他shell无效

注释

1)在当前shell定义的变量,对当前shell及子shell有效

<code>[root@izpo45bh60h6bsz ~]</code><code># declare -x name=pidof     #定义环境变量</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $name             </code>

<code>pidof</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $name</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># exit</code>

<code>[root@izpo45bh60h6bsz ~]</code><code>#</code>

位置变量

    $1,$2,.... 调用每个向脚本传递的参数

<code>[root@izpo45bh60h6bsz ~]</code><code># nano psvar.sh</code>

<code>#!/bin/bash</code>

<code>echo</code> <code>"\$1: $1"</code>

<code>echo</code> <code>"\$2: $2"</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># chmod +x psvar.sh </code>

<code>[root@izpo45bh60h6bsz ~]</code><code># ls -l psvar.sh</code>

<code>-rwxr-xr-x 1 root root 43 Aug  1 15:10 psvar.sh</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># ./psvar.sh tom jerry</code>

<code>$1: tom</code>

<code>$2: jerry</code>

特殊变量

    $0:表示命令本身,$?命令的执行状态结果 

<code># echo 'echo "\$0: $0"' &gt;&gt; psvar.sh</code>

<code>$0: .</code><code>/psvar</code><code>.sh</code>

    赋值:把value表示的值 存储在name变量的内存空间中   

<code># name='value'</code>

            name    内存空间的名字

            =          赋值符号

            value    值

            ‘ ’或 " " 引用符号

                引用实现赋值:

                    纯文本引用:将文本字符赋值给变量

                    变量的引用:将变量的值赋值给另一个变量

                    命令的引用:将命令的执行结果赋值给变量: 

                    混合使用

                    注意:赋值时,如果值有空格必须加引号

    变量引用实现赋值

<code>[root@izpo45bh60h6bsz ~]</code><code># username=pig</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># name=$username</code>

<code>pig</code>

    命令引用实现赋值

<code>[root@izpo45bh60h6bsz ~]</code><code># pwd</code>

<code>/root</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># name=`pwd`</code>

    混合使用

<code># filename=`date +%F-%H-%M-%S`</code>

<code># echo $filename</code>

<code>2017-08-01-15-41-45</code>

  值有空格,在赋值时需要加引号

<code>[root@izpo45bh60h6bsz ~]</code><code># name=tom obama</code>

<code>-</code><code>bash</code><code>: obama: </code><code>command</code> <code>not found</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># name="tom obama"</code>

<code>tom obama</code>

    变量引用 ,$name, ${name},通常用$name。当变量名与能作为变量名使用的字符串连在一起使用时,以免把整个名字当作变量,必须加 {}

        ' '  强引用 其中的变量引用,不会被替换为变量中所存储的值 

        " " 弱引用 其中的变量引用,会被替换为变量中 所存储的值 

1、何时应该使用${name}

<code># animal=pig</code>

<code># echo "there are some $animals" #把整个名字当作变量。由于此变量未定义,故为空</code>

<code>there are some </code>

<code># echo "there are some ${animal}s"</code>

<code>there are some pigs</code>

2、强引用和弱引用的区别

<code>[root@izpo45bh60h6bsz ~]</code><code># echo "$animal" 变量会被替换</code>

<code>pig </code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo '$animal' 变量不会被替换</code>

<code>$animal</code>

    显示所有本地变量和环境变量: set

    变量销毁:在shell终止时,变量会被销毁。在shell终止前销毁变量: unset name

<code>[root@izpo45bh60h6bsz ~]</code><code># name=pika</code>

<code>pika</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># unset name</code>

    赋值 把value表示的值 存储在name变量的内存空间中   

<code>方法一</code>

<code># declare -x name='value'</code>

<code>方法二</code>

<code># export name='value'</code>

<code>方法三</code>

<code># name=value</code>

<code># declare -x name</code>

<code># export name</code>

    引用

<code># $name,${name}</code>

 显示所有的环境变量

<code># export</code>

<code># env</code>

<code># printenv</code>

    其中大写的是环境变量: 定义bash工作环境

    bash有许多内建的环境变量:对于大写的变量,不要直接赋值,定义环境变量时,避免bash内建的环境变量,否则会改变bash的工作行为。

    PATH,SHELL,UID,PS1,HISTSIZE,HOME,PWD,OLDPWD

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $PATH      #bash解析命令所依赖的变量</code>

<code>/usr/local/nginx/sbin</code><code>:</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $SHELL     #当前shell环境</code>

<code>/bin/bash</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $UID       #当前有效用户的ID号码</code>

<code>0</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $PS1       #定义命令提示符字串</code>

<code>[\u@\H \W]\$</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $HISTSIZE  #显示命令条数</code>

<code>1000</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $HOME      #显示当前用户的家目录位置</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $PWD       #显示当前所处的目录</code>

<code>/root</code> 

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $OLDPWD    #显示最近一次切换的目录</code>

变量销毁:unset

<code>unset</code>

变量命名的法则

    1、不能使用关键字和保留字,if,for

    2、只能使用数字、字母及下划线,不能以数字开头

    3、尽量做到,见名知义

<code>totalweight --&gt; totalWeight 避免全部大写</code>

<code>--&gt; total_weight 或者用连字符</code>

    4、尽量避免 _ 开头

    5、尽量避免 全大写

文件名命名的法则

    1、区分大小写

    file1, File1, FILE1是不同的文件

    2、不使用特殊字符

    /:根目录,路径分隔符

    3、长度小于255个字符

    4、以.开头的文件,均为隐藏文件

LInux哲学思想

    1、一切皆文件

    2、组合小程序

    3、不交互

    4、文本编辑配置

常量、只读变量:定义变量后,变量不允许改变。只能等到shell进程终止时,才随之消亡

    赋值

<code>readonly</code> <code>name</code>

<code>declare</code> <code>-r name</code>

   查看

<code>[root@izpo45bh60h6bsz ~]</code><code># declare -r name='obama' ##定义只读变量</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># readonly -p  ##显示所有的只读变量</code>

<code>declare</code> <code>-ir PPID=</code><code>"11423"</code>

<code>declare</code> <code>-ir UID=</code><code>"0"</code>

<code>declare</code> <code>-r name=</code><code>"obama"</code>

    注释

<code>[root@izpo45bh60h6bsz ~]</code><code># name=obama</code>

<code>obama</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># readonly name</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># name=jerry</code>

<code>-</code><code>bash</code><code>: name: </code><code>readonly</code> <code>variable</code>

<code>-</code><code>bash</code><code>: </code><code>unset</code><code>: name: cannot </code><code>unset</code><code>: </code><code>readonly</code> <code>variable</code>

<code>[root@localhost ~]</code><code># name="jerry obame"</code>

<code>[root@localhost ~]</code><code># echo $name</code>

<code>jerry obame</code>

<code>[root@localhost ~]</code><code># declare -r name</code>

<code>[root@localhost ~]</code><code># name=hello</code>

<code>[root@localhost ~]</code><code># unset name</code>

局部变量

用于函数体中

    指令可以通过位置变量调用,向脚本传递的参数

    变量

<code>$1,$2,...对应调用 第1 第2 第3...参数</code>

<code>$0 命令本身</code>

    调用传递给脚本的所以的参数 

        $* 表示调用时,将传递的参数当作一个字串

        $@ 每个参数当作独立的字串

    $# 传递给脚本的参数的个数

<code>[root@izpo45bh60h6bsz ~]</code><code># cat posvar.sh </code>

<code>echo</code> <code>"\$3: $3"</code>

<code>echo</code> <code>"\$*: $*"</code>

<code>echo</code> <code>"\$@: $@"</code>

<code>echo</code> <code>"\$#: $#"</code>

<code>echo</code> <code>"\$0: $0"</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># ./posvar.sh tom jerry blair</code>

<code>$3: blair</code>

<code>$*: tom jerry blair</code>

<code>$@: tom jerry blair</code>

<code>$</code><code>#: 3</code>

<code>$0: .</code><code>/posvar</code><code>.sh</code>

    换港操作符 shift [n] 默认踢一个

<code>shift</code>

<code>shift</code> <code>2</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># ./posvar.sh tom jerry blair mariadb</code>

<code>$1: jerry</code>

<code>$1: mariadb</code>

<code>$*: mariadb</code>

<code>$@: mariadb</code>

<code>$</code><code>#: 1</code>

    向脚本传递参数,做文本行的统计  

<code># vim posvar.sh</code>

<code>countlines=`</code><code>cat</code> <code>$1 | </code><code>wc</code> <code>-l`</code>

<code>echo</code> <code>"$1 has $countlines lines"</code>

<code># ./posvar.sh /etc/fstab</code>

<code>/etc/fstab</code> <code>has 10 lines</code>

本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1952836,如需转载请自行联系原作者