變量

變量

    在shell腳本中,單獨的字符或者命令只能引用一次,對于變量,我們可以多次引用,且對變量的賦值修改方便。對于一條很長的命令或者頻繁使用的路徑等,我們可以賦值給一個變量,比如獲得系統中所有用戶的uid,要輸入很長的一段命令,我們如果每次使用都輸入命令是件很麻煩的事情,如果賦值變量,那么就會很方便。設置變量useruid

    useruid= `cat /etc/passwd|cut -d: -f3|sort -n`使用時直接echo “$useruid”,超級方便,接下來具體介紹一下變量,今天具體介紹一下本地變量和環境變量


目  錄

1、變量的命名法則

2、變量類型

3、bash變量種類

4、本地變量

5、環境變量


1、變量的命名規則

1)不能使程序中的保留字:例如if, for

2)只能使用字母、數字及下劃線,且不能以數字開頭

3)見名知義

4)統一命名規則:駝峰命名法

2、變量類型:

        wKiom1mGykOS2ouNAABHp7SeMxk473.png

3、bash變量種類

根據變量的生效范圍等標準可分為。

  (1)本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell    的子shell進程均無效

         當我們進入linux下,會自動進入一個bash ,在本地聲明的變量,只能在當前bash下使用,        再進入子bash中,便不能使用了稱為本地變量

         SHLVL: 顯示當前SHELL是幾級bash  用法:echo $SHLVL

         pstree 顯示進程樹

                                          -p 同時顯示進程的PID

                 $:顯示當前的PID   (運用為 echo $$)

   wKioL1mHGCqT52fsAAAnPGweIS4074.png

   wKiom1mHGOWgsk8DAAAja6_6nx0151.png

   可以看出本地變量僅對當前shell有效,當前shell的子shell進程

      接下來我們看一下對同級的shell是否有效。              

wKiom1mHHFPjdfklAABJV3UcHZs071.png

 wKioL1mHHGPTml8rAAAYgXBae_I861.png

     可以看出本地聲明的變量對同級的bash下也不能使用 

    總結:對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效

  (2)環境變量:生效范圍為當前shell進程及其子進程,父進程什么情況都無效

 wKioL1mHHjLRRnb5AABqC_rTQFE356.png

  結論:環境變量僅對其子shell有效,對父shell無效。        

wKioL1mHIRixVUmuAABVj59B8H4013.png

 wKioL1mHISiC-EYtAAAVYzdk8ME995.png

       結論:環境變量僅對其子shell有效,對其他無效。

  (3)局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)

  (4)位置變量: $1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數

  (5)特殊變量: $?, $0, $*, $@, $#,$$

 

4、本地變量

1)變量的賦值

   單獨一個無值變量的意義不大,對于一個變量,往往是先賦值后引用

    varname=’value’

   wKiom1mG37zgyp2KAAAX-cYW7xs350.png       

    可以使用引用value:

 (1) 可以是直接字串; A=”hello Hi”

 wKioL1mG4cDjCiWMAAAbg4McJg0163.png

 (2) 變量引用: A=”$USER”

 wKiom1mG4wCjVDVIAAAcq7OhVu4429.png

  USER 是bash的內部變量,表示當前用戶 

 (3) 命令引用: A=`COMMAND` varname=$(COMMAND)

     useruid= `cat /etc/passwd|cut -d: -f3|sort -n`

wKioL1mG5ejzZ-hgAAAtVe2bHvw228.png

對于變量的賦值大家可能很清楚,但是對于變量的引用,為什么有時加雙引號,有時不加引號,接下來具體講一下變量的引用

2)變量的引用

         變量的引用主要用$

  (1) $varname

         主要在數字和一般字符串

   (2)”$varname”   可以確定界限

   (3) ${varname}   可以確定界限        

    當變量值當中包含換行符,如果希望引用出的值同樣包含換行符,只能使用”$varname”

    就像上面的useruid一樣,由于獲得的用戶UID中每行都含有換行符,所以必須用””,如果不用         就會出現下列情況

wKioL1mG6JGh98b4AAAkaWAKUAE758.png

  所有UID排成的一行,因為不識別換行符,所以一定要使用”” ,才可以獲得自己所需的信息

(4)特殊情況:

   “”:弱引用,其中的變量引用會被替換為變量值  

   ”:強引用,其中的變量引用不會被替換為變量值,而保持原字符串

      例如將A=abc  ,當引用A是我們比較一下

wKiom1mG-OOR6kcNAAAy-UAsVss195.png    

 所以當在使用引號時,要注意自己是否引用了變量等

 例如在使用一些特殊字符時,雙引號就不可以實現

 wKiom1mG-vniYDwqAABGEPMSHxI724.png

總結:

     \ 完全轉譯  

     ” 完全轉譯

     “”部分轉譯,對于這四種不能轉移 斜杠\ 反引號`  嘆號! $不能轉,雙引號不能用,大家可        以嘗試一下,之后我會寫一篇博客專門介紹

3)變量的查看

           set 既顯示本地變量也顯示環境變量

      wKioL1mHDHjQ1qMJAABNmY1P_pg988.png

5、環境變量

1)變量的賦值

              (1) vaname=123

                        export varname 

       wKiom1mHD1PAvfpHAAAmDCbSges967.png


       wKiom1mHDtziSHtSAAA0MYXCofE298.png

2)export varname=value

可以直接給便量賦值

wKioL1mHD8SijxnwAAAnFDvzkrg427.png

(3)declare -x varname=value

wKioL1mHEIbz2HHJAAAxVrgAtZQ665.png 

2)變量的引用

               同本地變量的用法一樣

3)變量的查看  

     (1) set 可以查看本地變量和環境變量         

     (2)env    

             (3)printenv 

              在上面的已經看到了env的作用,看一下printenv ,這兩種的用法一樣

       wKioL1mHElGD485AAAAlk0MLD-c955.png

                              (4)export  

                               wKioL1mHE9_gVMK2AAA4V_eGJSg647.png

                             (5) declare –x   

                               wKiom1mHE_-j0JZjAABQhyhsJjo536.png     

                                 比較四種用法:

                              wKiom1mHEyLSLHFMAAAidYSj4YU001.png       

       總結:可以看出env 和printenv顯示的結果一樣,export 和 declare -x 顯示結果一樣 ,四種結果都會顯示出環境變量的數量一樣??梢噪S意選擇其中一種使用

4)變量的銷毀

           環境變量和本地變量的銷毀方式一樣,unset varname

            wKioL1mHFVWC_4RBAAApFyl2Obg615.png

          在平時的使用變量時,或者在寫腳本時,隨手寫一個命令,釋放A變量。畢竟變量的設置也會占用內存,積少成多。

 

原創文章,作者:guanman,如若轉載,請注明出處:http://www.www58058.com/84077

(0)
guanmanguanman
上一篇 2017-08-06 22:13
下一篇 2017-08-06 22:14

相關推薦

  • 磁盤配額

    磁盤配額 1 啟用磁盤配額 首先創建新的分區 /dev/sd5,并創建文件系統。 [root@local ~]# mkfs.ext4 /dev/sda5 由于xfs 不磁盤配額能成功,這里使用ext4. 然后把/dev/sda5分區掛載到 /home [root@local ~]# mount /dev/sda5 /home [root@local ~]# …

    Linux干貨 2017-05-02
  • 鏈接分析算法之:SALSA算法

      SALSA算法的初衷希望能夠結合PageRank和HITS算法兩者的主要特點,既可以利用HITS算法與查詢相關的特點,也可以采納PageRank的“隨機游走模型”,這是SALSA算法提出的背景。由此可見,SALSA算法融合了PageRank和HITS算法的基本思想,從實際效果來說,很多實驗數據表明,SALSA的搜索效果也都優于前兩個算…

    大數據運維 2015-07-21
  • 文本處理工具-習題

    1 、找出ifconfig 命令結果中本機的所有IPv4地址 [root@centos7 ~]# ifconfig |head -2 |tail-1 |cut -dn -f2 |cut -d" " -f2 2 、查出分區空間使用率的最大百分比值 [root@centos7 ~]# df |cut -c44-46 |sort -n|tail…

    Linux干貨 2016-08-15
  • mysql數據庫及表的管理

    MySQL中字符大小寫: 1、SQL關鍵字及函數名不區分字符大小寫; 2、數據庫、表及視圖名稱的大小區分與否取決于低層OS及FS 3、存儲過程、存儲函數及事件調度器的名字不區分大小寫,但觸發器區分; 4、表別名區分大不寫; 5、對字段中的數據,如果字段類型為Binary類型,則區分大小寫;非Binary不區分大小寫; 數據庫: CREATE {DATABAS…

    Linux干貨 2015-06-01
  • 模擬centos6.8系統下initramfs文件和vmlinuz文件損壞恢復

    實驗一:關于刪除initramfs-2.6.32-642.el6.x86_64.img 文件恢復實驗,實驗環境centos6.8系統 1.安全起見,請先安排做快照及備份 把initramfs-2.6.32-642.el6.x86_64.img 文件復制一份/root目錄下。 [root@centos6: boot]# cp -a initramfs-2.6.…

    2017-05-15
  • 馬哥教育網絡班21期+第6周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; %s/^([[:space:]]{1,}.*)/#\1/s 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行…

    Linux干貨 2016-08-15
欧美性久久久久