天天看點

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,如需轉載請自行聯系原作者