bash-高级编程--变量和参数介绍
文章目錄
- 變量的替換
- 使用trap設(shè)計一個用于反應(yīng)程序執(zhí)行過程的腳本
- 變量的賦值
- `bash`變量是不區(qū)分類型的
- 特殊變量類型
變量是什么,變量是腳本編程中進行數(shù)據(jù)表現(xiàn)的一種方法,說白了,變量不過是計算機為了保留數(shù)據(jù)項,而在內(nèi)存中分配的一個位置或一組位置的標識或名字。
變量的替換
變量的名字就是保存變量值的地方,引用變量的值就叫做變量替換
$
在shell中要仔細區(qū)分變量的名字和變量的值,如果a是一個變量,那么$a就是引用這個變量的值,即變量所包含的數(shù)據(jù)。
andrew@andrew-Thurley:/work/linux-sys/bash$a=1 andrew@andrew-Thurley:/work/linux-sys/bash$ echo a a andrew@andrew-Thurley:/work/linux-sys/bash$ echo $a 1當變量裸體出現(xiàn)的時候,也就是說沒有$前綴的時候,那么變量可能存在如下幾種情況
trap.sh
#!/bin/bash # 使用trap來捕捉變量值.trap 'echo Variable Listing --- a = $a b = $b' EXIT # EXIT是腳本中exit命令所產(chǎn)生信號的名字. # # "trap"所指定的命令并不會馬上執(zhí)行, #+ 只有接收到合適的信號, 這些命令才會執(zhí)行. echo "This prints before the \"trap\" --" echo "even though the script sees the \"trap\" first." echo a=39 b=36 exit 0 andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap.sh This prints before the "trap" -- even though the script sees the "trap" first.Variable Listing --- a = 39 b = 36被一雙引號""括起來的變量替換是不會被阻止的,所以雙引號被稱為部分引用,有的時候又被稱為弱引用。如果是使用單引號的話''那么比變量的替換就會被禁止,變量名只會被解釋成字面的意思,不會出發(fā)變量的替換。所以單引號被稱為全引用,有的時候被稱為強引用
#!/bin/bash# 變量賦值和替換a=375 hello=$a#------------------------------------------------------------------ # 強烈注意, 在賦值的的時候, 等號前后一定不要有空格. # 如果出現(xiàn)空格會怎么樣?# "VARIABLE =value" # #% 腳本將嘗試運行一個"VARIABLE"的命令, 帶著一個"=value"參數(shù).# "VARIABLE= value" # #% 腳本將嘗試運行一個"value"的命令, #+ 并且?guī)е粋€被賦值成""的環(huán)境變量"VARIABLE". #------------------------------------------------------------------ echo hello # 沒有變量引用, 只是個hello字符串. echo $hello echo ${hello} # 同上.echo "$hello" echo "${hello}"echohello="A B C D" echo $hello # A B C D echo "$hello" # A B C D # 就象你看到的echo $hello和echo "$hello"將給出不同的結(jié)果. # =============================================================== # 引用一個變量將保留其中的空白, 當然, 如果是變量替換就不會保留了. # ===============================================================echoecho '$hello' # $hello # # 全引用的作用將會導(dǎo)致"$"被解釋為單獨的字符, #+ 而不是變量前綴.# 注意這兩種引用所產(chǎn)生的不同的效果.# 設(shè)置為空值. hello= echo "\$hello (null value) = $hello" # 注意設(shè)置一個變量為null, 與unset這個變量, 并不是一回事 #+ 雖然最終的結(jié)果相同(具體見下邊).# --------------------------------------------------------------# 可以在同一行上設(shè)置多個變量, #+ 但是必須以空白進行分隔. # 慎用, 這么做會降低可讀性, 并且不可移植.var1=21 var2=22 var3=$V3 echo echo "var1=$var1 var2=$var2 var3=$var3"# 在老版本的"sh"上可能會引起問題.# --------------------------------------------------------------echo; echonumbers="one two three" # other_numbers="1 2 3" ## 如果在變量中存在空白, If there is whitespace embedded within a variable, #+ 那么就必須加上引用. # other_numbers=1 2 3 # 給出一個錯誤消息. echo "numbers = $numbers" echo "other_numbers = $other_numbers" # other_numbers = 1 2 3 # 不過也可以采用將空白轉(zhuǎn)義的方法. mixed_bag=2\ ---\ Whatever #在轉(zhuǎn)義符后邊的空格(\).echo "$mixed_bag" # 2 --- Whateverecho; echoecho "uninitialized_variable = $uninitialized_variable" # Uninitialized變量為null(就是沒有值). uninitialized_variable= # 聲明, 但是沒有初始化這個變量,#+ 其實和前邊設(shè)置為空值的作用是一樣的. echo "uninitialized_variable = $uninitialized_variable"# 還是一個空值.uninitialized_variable=23 # 賦值. unset uninitialized_variable # Unset這個變量. echo "uninitialized_variable = $uninitialized_variable"# 還是一個空值. echoexit 0像C語言中的變量一樣,一個未初始化的變量將會是null值 - 就是未賦值(但并不代表值是0),在給變量 賦值之前就使用這個變量通常會引起問題。
### 小知識加油站–trap
trap的格式如下,功能就是捕捉信號,并對信號進行處理
trap [-lp] [[arg] sigspec ...]trap使用官方簡介
trapAutomatically execute commands after receiving signals by processes or the operating system.Can be used to perform cleanups for interruptions by the user or other actions.- List available signals to set traps for:trap -l- List active traps for the current shell:trap -p- Set a trap to execute commands when one or more signals are detected:trap 'echo "Caught signal SIGHUP"' SIGHUP- Remove active traps:trap - SIGHUP SIGINT- arg可以是shell命令或者自定義函數(shù)
- sigspec可以是以下的一個或多個
- 定義在<signal.h>中的信號名或者數(shù)值。信號名的大小寫不敏感,SIG這個前綴也是可選的。以下的命令的效果都是一樣的
調(diào)試腳本時,trap經(jīng)常用到的信號量
- EXIT:在shell退出前執(zhí)行trap設(shè)置的命令,也可以指定為0
- RETURN:在.和``source執(zhí)行其他腳本返回時,執(zhí)行trap`設(shè)置的命令
- DEBUG:在任何命令執(zhí)行前執(zhí)行trap設(shè)置的命令,但對于函數(shù)僅在函數(shù)的第一條命令前執(zhí)行一次
- ERR:在命令結(jié)果為非0時,執(zhí)行trap設(shè)置的命令
執(zhí)行結(jié)果
andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap_func.sh before a func iis called before a func iis called call . before a func iis called . or source is called before a func iis called 不管你信不信,這是一個函數(shù)- trap -l:列出所有信號的數(shù)值和名字,類似于kill -l
- trap -p:列出通過trap設(shè)置過的信號處理命令
注意
- 在函數(shù)中設(shè)置的trap也是全局生效的
- 對于同一個信號,只有最后一次trap生效
- trap只在本進程內(nèi)有效,它的子進程不會繼承trap的設(shè)置。
使用trap設(shè)計一個用于反應(yīng)程序執(zhí)行過程的腳本
#!/bin/bash # 使用trap來捕捉變量值.# EXIT代表在函數(shù)退出前,執(zhí)行trap trap 'echo Variable Listing --- ret=${ret}' EXITps -A if [ $? == 0 ];thenecho "commond exec OK!"ret=0 elseret=1 fiecho "注意這里,還沒有調(diào)用trap"# trap是在退出的時候清理程序時調(diào)用的 exit 0變量的賦值
=
賦值操作(前后都不能有空白)
注意:因為=和-eq都可以用作條件測試操作,所以不要與這里的賦值操作相混淆。
=既可以用作條件測試操作,也可以用于賦值操作,這需要視具體上下文而定
簡單的變量賦值
#!/bin/bash # "裸體"變量 echo # 變量什么時候是"裸體"的, 比如前邊少了$的時候? # 當它被賦值的時候, 而不是被引用的時候. # 賦值 a=879 echo "The value of \"a\" is $a." # 使用'let'賦值 let a=16+5 echo "The value of \"a\" is now $a." echo # 在'for'循環(huán)中(事實上, 這是一種偽賦值): echo -n "Values of \"a\" in the loop are: " for a in 7 8 9 11 doecho -n "$a " done echo echo # 使用'read'命令進行賦值(這也是一種賦值的類型): echo -n "Enter \"a\" " read a echo "The value of \"a\" is now $a." echoexit 0簡單又不簡單的的兩種類型的變量賦值
#!/bin/bash a=23 # 簡單的賦值 echo $a b=$a echo $b # 現(xiàn)在讓我們來點小變化(命令替換). a=`echo Hello!` # 把'echo'命令的結(jié)果傳給變量'a' echo $a # 注意, 如果在一個#+的命令替換結(jié)構(gòu)中包含一個(!)的話, #+ 那么在命令行下將無法工作. #+ 因為這觸發(fā)了Bash的"歷史機制." # 但是, 在腳本中使用的話, 歷史功能是被禁用的, 所以就能夠正常的運行. a=`ls -l` echo $a echo echo "$a" exit 0使用$(...)機制來進行變量賦值(這是一種比后置引用(反引號`)更新的一種方法). 事實上這兩種
方法都是命令替換的一種形式.
bash變量是不區(qū)分類型的
不像其他程序語言一樣,bash并不區(qū)分變量的類型,本質(zhì)上bash變量都是字符串。實際的作用依賴于上下文,Bash也允許比較操作和整數(shù)操作,其中的關(guān)鍵因素就是,變量中的值是否只有數(shù)值。
#!/bin/bash # int-or-string.sh: 整型還是字符串?a=2334 #整型. let "a += 1" echo "a = $a " # a = 2335 echo # 還是整型. b=${a/23/BB} # 將"23"替換成"BB". # 這將把變量b從整型變?yōu)樽址? echo "b = $b" # b = BB35 declare -i b # 即使使用declare命令也不會對此有任何幫助. echo "b = $b" # b = BB35 let "b += 1" # BB35 + 1 = echo "b = $b" # b = 1 echo c=BB34 echo "c = $c" # c = BB34 d=${c/BB/23} # 將"BB"替換成"23". # 這使得變量$d變?yōu)橐粋€整形. echo "d = $d" # d = 2334 let "d += 1" # 2334 + 1 = echo "d = $d" # d = 2335 echo# null變量會如何呢? e="" echo "e = $e" # e = let "e += 1" # 算術(shù)操作允許一個null變量? echo "e = $e" # e = 1 echo # null變量將被轉(zhuǎn)換成一個整型變量.# 如果沒有聲明變量會怎樣? echo "f = $f" # f = let "f += 1" # 算術(shù)操作能通過么? echo "f = $f" # f = 1 echo # 未聲明的變量將轉(zhuǎn)換成一個整型變量. # 所以說Bash中的變量都是不區(qū)分類型的. exit 0不區(qū)分變量的類型既是幸運的事情也是悲慘的事情. 它允許你在編寫腳本的時候更加的靈活(但是也足
夠把你搞暈!), 并且可以讓你能夠更容易的編寫代碼. 然而, 這也很容易產(chǎn)生錯誤, 并且讓你養(yǎng)成糟糕
的編程習(xí)慣.
這樣的話, 程序員就承擔了區(qū)分腳本中變量類型的責任. Bash是不會為你區(qū)分變量類型的
特殊變量類型
局部變量
這種變量只有代碼塊或者函數(shù)中才可見
如果變量用local 來聲明, 那么它就只能夠在該變量被聲明的代碼塊中可見. 這個代碼塊就是局
部"范圍". 在一個函數(shù)中, 一個局部變量只有在函數(shù)代碼塊中才有意義.
環(huán)境變量
這種變量將影響用戶接口和shell的行為
總結(jié)
以上是生活随笔為你收集整理的bash-高级编程--变量和参数介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:崔辰州(1976-),男,博士,中
- 下一篇: ubuntu16.04上安装graphy