變數基礎知識
程式由指令加資料所組成,而變數可以理解為資料來源的一種,
變數名可以理解為指向了某個記憶體空間的地址,對于變數的賦值可理解為向記憶體空間寫入資料,對于變數的參考可理解為從記憶體空間讀取資料,
變數有型別的概念(例如字串、數字等),不同的型別決定了資料的存盤格式、可表示的資料范圍以及可參與的運算等,
在編程語言中,可以根據變數的強弱來劃分,例如C語言屬于強型別變數的語言,該類變數在型別不同的情況下無法直接進行運算,bash腳本則屬于弱型別變數的語言,不同型別的變數可以直接運算,默認將所有的變數統一視為字符型,必須在借助第三方工具的情況下才可以進行浮點數的運算,變數無需事先宣告即可使用(相當于把宣告、賦值和定義資料型別的操作同時實作),
變數的宣告就是事先占用好這個記憶體空間,變數的強弱之分與是否需要事先宣告無關,例如python是強變數型別的編程語言但是其變數不需要事先宣告,
變數名可由字母、數字和下劃線組成,并且不允許數字打頭(幾乎所有的編程語言均如此),變數名要盡量做到見名知意,并且要有一定的規則,根據詞語來劃分(駝峰法、下劃線法等),例如:
my_favorite_sport="basketball" myFavoriteSport="basketball"
不要使用bash保留字來給變數命名,例如if、else、then等,
變數根據作用域可以劃分為三種:
- 本地變數:僅當前shell有效(即當前bash行程),
- 環境變數:當前shell及其子shell(即當前bash行程即其子bash行程),
- 區域變數:在某部分代碼片段中有效(例如函式),
除了上述三種,還有位置引數變數和特殊變數:
- 位置引數變數:用于傳參給shell腳本或者函式的變數,例如${1}、${2}等,
- 特殊變數:在shell中具有特殊含義的變數,例如$?、$-等,
本地變數
本地變數的賦值與參考:
賦值:name=value
參考:${name}或者$name
在我們使用變數的時候,會遇到引號的情況,在bash中,參考(quoting)的作用是抑制bash對某些字符的特殊作用(例如美元符號$,就會做一些變數展開或者特殊符號的處理),而引號則是參考的其中兩種方式(單引號和雙引號),
單引號會使得其中的所有字符只有其字面意義,而雙引號只會抑制大部分的特殊字符含義,但是不包括$等其他一些字符,
[root@c7-server ~]# name=zwl [root@c7-server ~]# echo '${name}' ${name} [root@c7-server ~]# echo "${name}" zwl
在參考變數的時候,也建議使用${name},因為這樣子才可以支持bash的引數展開功能,
[root@c7-server ~]# echo ${name} alongdidi [root@c7-server ~]# echo ${name:2:3} ong [root@c7-server ~]# echo $name:2:3 alongdidi:2:3
我們可以通過set(bash內置命令)來查看已經設定的變數名稱和值,不過set所顯示出來的變數非常多,還包含了環境變數和函式,因此一般需要通過管道傳輸給less分頁或者grep過濾,
~]# set | grep "^name" name=alongdidi
set還可以用于設定shell的屬性(即作業特性)和位置引數,這里不展開,
當某個變數我們不要的時候,可以使用unset來將其取消掉,
[root@c7-server ~]# unset name [root@c7-server ~]# echo $name [root@c7-server ~]# set | grep "^name" [root@c7-server ~]#
unset命令可以取消變數,也可以取消函式,
unset [-f] [-v] [name ...]
-f:指明取消的name是函式,
-v:指明取消的name是變數,
這兩個選項都可以省略,unset會首先嘗試取消一個變數,若失敗則再次嘗試取消一個函式,某些變數無法被unset,例如只讀變數,
可以通過shell內置命令readonly來將shell變數或者函式設定為只讀的屬性,
readonly [-aAf] [name[=value] ...]
readonly -p
第一種語法,是設定一個變數為只讀變數并且可以選擇是否賦值,如果此時不賦值,那么設定為只讀后就無法再賦值或者改值了,
-a:指明name為索引陣列(indexed array),
-A:指明name為關聯陣列(associative array),
-f:指明name為函式(function),
[root@c7-server ~]# readonly age=28 [root@c7-server ~]# age=30 -bash: age: readonly variable [root@c7-server ~]# unset age -bash: unset: age: cannot unset: readonly variable
-p:單獨使用,顯示出所有的只讀變數和函式,
[root@c7-server ~]# readonly -p declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d" declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")' declare -ir EUID="0" declare -ir PPID="3530" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -ir UID="0" declare -r age="28"
注意:declare -r就表示定義一個只讀變數,這也是個shell內置命令,后面會提到,
我們剛說了,本地變數的作用域只在當前的shell中,那么在子shell和其他shell中應該是不存在的,我們來證明一下,
[root@c7-server ~]# pstree -ph 1148 sshd(1148)─┬─sshd(1851)───bash(1857) ├─sshd(3530)───bash(3536)───pstree(4859) └─sshd(4125)───bash(4131) [root@c7-server ~]# name=alongdidi [root@c7-server ~]# echo $name alongdidi [root@c7-server ~]# bash [root@c7-server ~]# pstree -ph 1148 sshd(1148)─┬─sshd(1851)───bash(1857) ├─sshd(3530)───bash(3536)───bash(4861)───pstree(4894) └─sshd(4125)───bash(4131) [root@c7-server ~]# echo $name [root@c7-server ~]#
我們原本在PID為3536的shell(bash行程)中,在當前shell設定了變數name并且可獲取其值,隨后使用bash命令進入了子shell(PID為4861的bash行程)中再獲取這個變數,就獲取不到了,
如果我們使用exit命令退回剛才的父shell,就又可以獲取到該值,
[root@c7-server ~]# exit exit [root@c7-server ~]# echo $name alongdidi
我們切換使用Xshell再創建了一個新的session,在那個session下嘗試獲取該變數的值,也是沒有的,證明成功,
[root@c7-server ~]# pstree -ph 1148 sshd(1148)─┬─sshd(1851)───bash(1857) ├─sshd(3530)───bash(3536) └─sshd(4125)───bash(4131)───pstree(4860) [root@c7-server ~]# echo $name [root@c7-server ~]#
本地變數的生命周期,從創建的時候開始,直到所在的bash行程結束(比如使用exit)或者變數被unset,
環境變數
環境變數的作用域是當前shell及其子shell,因此也可以理解為將變數輸出(export)到了子shell中,無論子shell的層數有幾層,只要變數具備環境變數的屬性,那么它就都會有值,
可以通過export或者declare將變數設定為環境變數,
[root@c7-server ~]# export name [root@c7-server ~]# bash [root@c7-server ~]# echo $name alongdidi [root@c7-server ~]# bash [root@c7-server ~]# echo $name alongdidi [root@c7-server ~]# bash [root@c7-server ~]# echo $name alongdidi
export的語法如下,
export [-fn] [name[=value] ...]
export -p
-f:宣告name是一個函式,
-n:去除環境變數的屬性,
-p:使用該選項或者僅使用export命令的話,可以查看當前所有的環境變數,declare -x有同效,外部命令env和printenv也可以實作,
export是專門用于設定與環境變數屬性相關的命令,declare是設定所有與變數相關的屬性(只讀、環境變數、整型、索引陣列、關聯陣列)等等,
多命令執行
;:分號,命令按順序執行,執行完第一個再執行第二個,后一個命令的執行與否與前一個命令的執行成功與否無關,
~]# COMMAND1; COMMAND2
&&:邏輯與,只有當COMMAND1執行成功的時候,才執行COMMAND2,類似于邏輯與運算,a && b,當a為1的時候(執行成功)還需要看b的值(即還需要執行b)才能決定整個運算式的值,如果a為0了,那么整個運算式必然為0,就不需要看b的值了(b就可以不執行),這也叫短路法則,
~]# COMMAND1 && COMMAND2
||:邏輯或,只有當COMMAND1執行失敗的時候,才執行COMMAND2,
~]# COMMAND1 || COMMAND2
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/148731.html
標籤:Linux
上一篇:Linux 使用vi命令的教程
下一篇:Linux Pptpd
