shell總結筆記——關於變量

BASH:主要的優勢:shell

  • 命令編修能力;
  • 命令與文件補全功能;
  • 命令別名設置功能;
  • 工做控制、前景背景控制;
  • 程序化腳本;
  • 萬用字符;

一、什麼是變量?

一、 讓某一個特定的字符串表明不固定的內容。
二、 變量就是讓一組文字或符號等來取代一些設置,或者是一串保留的數據。
三、變量的格式:變量名=變量內容(變量名通常設置爲大寫字母,專業一些)。centos

設置變量的規則:
一、 變量與變量內容以一個等號「=」來連接;
二、 等號兩邊不能直接接空白字符;
三、 變量名稱只能是英文字母與數字,可是開頭字符不能是數字;
四、 變量內容如有空白字符可使用雙引號,或單引號講變量內容結合起來。雙引號內的特殊字符如$等,能夠保有本來的特性;單引號內的特殊字符則僅做爲通常字符(純文本)。
五、 可用轉義符「\」將特殊符號變成通常字符;
六、 在一串指令的執行中,還須要藉由其餘額外的指令所提供的信息時,可使用反撇號,而不是單引號。
七、 若該變量須要在其餘子程序執行,則須要一export來使自定義變量變成環境變量。
八、 一般大寫字符爲系統默認變量,自行設置變量可使用小寫字符,方便判斷;
九、 取消變量的方法爲使用unset: 「unset 變量名稱」例如取消myname的設置:unset myname。bash

有關shell變量定義、賦值及變量輸出加單引號、雙引號、反引號與不加引號的簡要說明,以下表所示:dom

shell總結筆記——關於變量
建議:編輯器

在腳本中定義普通字符串變量時,應儘可能把變量的內容用雙引號括起來;
單純數字的變量內容能夠不加引號;
但願變量的內容原樣輸出時須要加單引號;
但願變量值引用命令並獲取命令的結果時就用反單引號或$( )。
env命令——查詢環境變量。
random命令:隨機產生的數字是在0——32768之間。ide

set命令:查詢的是全部的變量,包括環境變量和自定義變量。函數

$:表明的是當前shell的PID號,如echo $$;測試

?:表明的是上一個指令的回傳值,如echo $?命令行

自定義變量與環境變量最大的區別是:該變量是否會被子程序(子shell)繼續使用。code

各類變量定義的做用域:

  • 環境變量=全域變量
  • 自定義變量=區域變量

關於系統中的環境變量解釋:
shell總結筆記——關於變量

PS1——系統特定變量名

其中PS1這個變量須要解釋下,其餘能夠自行看懂,PS1可用的選項以下:

  • \d :可顯示出「星期月日」的日期格式,如:"Mon Feb 2"
  • \H :完整的主機名稱。舉例來講,個人練習機爲「study.centos.vbird」
  • \h :僅取主機名稱在第一個小數點以前的名字,如我主機則爲「study」後面省略
  • \t :顯示時間,爲 24 小時格式的「HH:MM:SS」
  • \T :顯示時間,爲 12 小時格式的「HH:MM:SS」
  • \A :顯示時間,爲 24 小時格式的「HH:MM」
  • \@ :顯示時間,爲 12 小時格式的「am/pm」樣式
  • \u :目前使用者的賬號名稱,如「dmtsai」;
  • \v :BASH 的版本信息,如個人測試主機版本爲 4.2.46(1)-release,僅取「4.2」顯示
  • \w :完整的工做目錄名稱,由根目錄寫起的目錄名稱。但主文件夾會以 ~ 取代;
  • \W :利用 basename 函數取得工做目錄名稱,因此僅會列出最後一個目錄名。
  • #:下達的第幾個指令。
  • \$ :提示字符,若是是 root 時,提示字符爲 # ,不然就是 $

用法示例:

[root@localhost ~]# PS1='[\u@\h\w\A#\#]\$'     #添加上面的一些選項
[root@localhost~13:07#5]#cd /etc    #多執行兩下命令
[root@localhost/etc13:07#6]#cd /boot
[root@localhost/boot13:07#7]#exit
#能夠發現,執行PS1這個變量並結合一些選項的使用,能夠暫時改變命令提示符的變化,
#而且後面的數字會每執行一次,就增長一個數,這是\#的做用

設置變量的方式1

shell總結筆記——關於變量

[root@localhost ~]# path=$PATH #先自定義一個變量,引用「PATH」的值,用「path」變量作測試
[root@localhost ~]# echo $path    #輸出進行確認下
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo ${path#/*local/sbin:}   #試着刪除一個
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#在上面的命令中,「$」是關鍵字,用在這種刪除模式所必須存在的;
#「path」就是本來的變量名稱;
#「#」表明從變量內容的最前面開始向右刪除,且只刪除最短的那個;
#「/*local/sbin:」表明要被刪除的部分,因爲「#」表明從前面開始刪除,
#因此這裏就從「/」寫起,而且可使用「*」這個萬用字符,能夠表明任意內容。
#但這條命令並無改變「path」變量的內容,能夠將「echo」換爲「path=」便可直接改變變量內容。
#以下:
[root@localhost ~]# path=${path#/*local/sbin:}
[root@localhost ~]# echo $path
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#這就將本來的變量值更改爲功了。

關於其餘的更改方式,參考上面的表格便可咯!

(2)

shell總結筆記——關於變量
示例1——測試一下是否存在username這個變量,若不存在則賦值username爲root。

[root@localhost ~]# echo $username   #查看username變量是否存在
[root@localhost ~]# username=${username-root}   #若是變量內容不存在就賦值爲root
[root@localhost ~]# echo $username    #變量不存在,因此將它賦值了root
root
[root@localhost ~]# username='lv jian zhao'    #那麼如今給它賦值
[root@localhost ~]# username=${username-root}    #再次使用這個,表示若是值不存在,則將它賦值爲root
[root@localhost ~]# echo $username    #再次輸出,會發現仍是咱們手工賦的值,並無給它賦值爲root
lv jian zhao
#從上面能夠看出「-」號的做用,就是若是值不存在,就給它賦值「-」號後面的值,若存在,則放棄。

示例2——若username未設置或爲空字串,則將username內容設置爲root

[root@localhost ~]# username=""     #將username設置爲空字串
[root@localhost ~]# username=${username-root}    #若值不存在,則賦值爲root
[root@localhost ~]# echo $username    

#輸出該變量,會發現仍是空的,由於username的值是存在的,只不過是空字串而已,因此並無賦值爲root
[root@localhost ~]# username=${username:-root}   #使用「:-」試試
[root@localhost ~]# echo $username    #會發現已經賦值爲root了
root

#說明:「:-」的做用就是若是值爲空或是未設置,都能被後面的內容替換。

設置變量的方式2

環境變量通常是指用export內置命令導出的變量,用於定義Shell的運行環境,保證Shell命令的正確執行。Shell經過環境變量來肯定登陸用戶名、命令路徑、終端類型、登陸目錄等,全部的環境變量都是系統全局變量,可用於全部子進程中,這包括編輯器、Shell腳本和各種應用。
環境變量能夠在命令行中設置和建立,但用戶退出命令行時這些變量值就會丟失,所以,若是但願永久保存環境變量,可在用戶家目錄下的.bash_profile或.bashrc(非用戶登陸模式特有,例如遠程文件中,或者全局配置/etc/bashrc(非用戶登陸模式特有,例如遠程SSH)或/etc/profile文件中定義。在將環境變量放入上述的文件中後,每次用戶登陸時這些變量都將被初始化。
按照系統規範,全部環境變量的名字均採用大寫形式。在將環境變量應用於用戶進程程序以前,都應該用export命令導出定義,例如:正確的環境變量定義方法爲export OLDGIRL=1。
有一些環境變量,好比HOME、PATH、SHELL、UID、USER等,在用戶登陸以前就已經被/bin/login程序設置好了。一般環境變量被定義並保存在用戶家目錄下的.bash_profile文件或全局的配置文件/etc/profile中,具體的環境變量說明請參考下表:
shell總結筆記——關於變量
在查看設置的變量時,有3個命令能夠顯示變量的值:set、env和declare(替代早期的typeset)。set命令輸出全部的變量,包括全局變量和局部變量;env命令只顯示全局變量;declare命令輸出全部的變量、函數、整數和已經導出的變量。set-o命令顯示bash Shell的全部參數配置信息。
查看舉例:

[root@localhost ~]# env | tail   #使用env命令進行查看全局變量
[root@localhost ~]# set -o     #使用set -o查看bash  shell的全部參數配置信息

設置環境變量的方式

若是想要設置環境變量,就要在給變量賦值以後或在設置變量時使用export命令,具體設置見下文的示例。其實,除了export命令,帶-x選項的declare內置命令也能夠完成一樣的功能(注意:此處不要在變量名前面加$):
export命令和declare命令的格式以下:

①export 變量名=value②變量名=value ; export 變量名③declare -x 變量名=value
#以上就是三種設置環境變量的三種方法

上面設置的全局變量只是臨時設置的,重啓系統後,就失效了,那麼能夠將變量寫入如下幾個文件其中之一便可,使其永久生效:

一、只對用戶的環境變量配置

[lv@localhost ~]$ ls ~/.bashrc ~/.bash_profile 
#對於用戶的環境變量設置,比較常見的是用戶家目錄下的這兩個目錄,推薦寫入第一個文件「.bashrc」

二、全局環境變量的配置
常見的全局環境變量的配置文件以下:

/etc/profile
/etc/bashrc                       #推薦在此文件中優先設置
/etc/profile.d/

環境變量總結

環境變量的定義:

  • 變量名一般要大寫;
  • 變量能夠在自身的shell及子shell中使用;
  • 經常使用export來定義環境變量;
  • 數字內容的變量定義能夠不加引號,其餘沒有特殊要求的字符串等定義最好都加上雙引號;若是真的須要原樣輸出就加單引號;定義變量加雙引號是最多見的使用場景;
  • 若是須要獲取命令結果賦值給變量,則可使用反撇號``(tab鍵上面的那個按鍵)或者括號「()」將命令字括起來;
  • 執行env默承認以顯示全部的環境變量名稱及對應的值;
  • 輸出時用「echo $變量名」,取消時用「unset 變量名」;
  • 書寫crond定時任務時要注意,腳本要用到環境變量最好如今所執行的shell腳本中從新定義;
  • 若是但願環境變量永久生效,則能夠將其放在用戶環境變量文件或全局環境變量文件裏;

環境變量初始化與對應文件的生效順序:
在登陸Linux系統並啓動一個bash shell時,默認狀況下bash會在若干個文件中查找環境變量的設置這些文件,這些文件可統稱爲系統環境文件。bash檢查的環境變量文件的狀況取決於系統運行shell的方式。系統運行shell的方式通常有3種:①經過系統用戶登陸後默認運行的shell;②非登陸交互式運行shell;③執行腳本運行非交互式shell。

用戶登陸系統後首先會加載/etc/profile全局環境變量文件,這是Linux系統上默認的shell主環境變量文件,系統上每一個用戶登陸都會加載這個文件。

當加載完/etc/profile文件後,纔會執行/etc/profile.d目錄下的腳本文件,這個目錄下的腳本文件有不少,例如:系統的字符集設置(/etc/sysconfig/il8n)等。

以後開始運行$HOME/.bash_profile(用戶環境變量文件),在這個文件中,又會去找$HOME/.bashrc(用戶環境變量文件),若是有,則執行,若是沒有,則不執行。在$HOME/.bashrc文件中又會去找/etc/bashrc(全局環境變量文件),若是有,則執行,若是沒有,則不執行。

若是用戶的shell不是登陸時啓動的(好比手動敲下bash時或者其餘不須要輸入密碼的登陸及遠程鏈接狀況),那麼這種非登陸shell只會加載$HOME/.bashrc,並會去找/etc/bashrc文件。所以若是但願在非登陸shell下也能夠督導設置的環境變量等內容,就須要將變量設定等寫入$HOME/.bashrc或者/etc/bashrc,而不是$HOME/.bash_profile或/etc/profile。

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索