shell--变量的替换
生活随笔
收集整理的這篇文章主要介紹了
shell--变量的替换
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 變量的替換
- 小知識(shí)加油站--trap
- 使用trap設(shè)計(jì)一個(gè)用于反應(yīng)程序執(zhí)行過程的腳本
變量是什么,變量是腳本編程中進(jìn)行數(shù)據(jù)表現(xiàn)的一種方法,說白了,變量不過是計(jì)算機(jī)為了保留數(shù)據(jù)項(xiàng),而在內(nèi)存中分配的一個(gè)位置或一組位置的標(biāo)識(shí)或名字。
變量的替換
變量的名字就是保存變量值的地方,引用變量的值就叫做變量替換
$
在shell中要仔細(xì)區(qū)分變量的名字和變量的值,如果a是一個(gè)變量,那么$a就是引用這個(gè)變量的值,即變量所包含的數(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當(dāng)變量裸體出現(xiàn)的時(shí)候,也就是說沒有$前綴的時(shí)候,那么變量可能存在如下幾種情況
trap.sh
#!/bin/bash # 使用trap來捕捉變量值.trap 'echo Variable Listing --- a = $a b = $b' EXIT # EXIT是腳本中exit命令所產(chǎn)生信號(hào)的名字. # # "trap"所指定的命令并不會(huì)馬上執(zhí)行, #+ 只有接收到合適的信號(hào), 這些命令才會(huì)執(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被一雙引號(hào)""括起來的變量替換是不會(huì)被阻止的,所以雙引號(hào)被稱為部分引用,有的時(shí)候又被稱為弱引用。如果是使用單引號(hào)的話''那么比變量的替換就會(huì)被禁止,變量名只會(huì)被解釋成字面的意思,不會(huì)出發(fā)變量的替換。所以單引號(hào)被稱為全引用,有的時(shí)候被稱為強(qiáng)引用
#!/bin/bash# 變量賦值和替換a=375 hello=$a#------------------------------------------------------------------ # 強(qiáng)烈注意, 在賦值的的時(shí)候, 等號(hào)前后一定不要有空格. # 如果出現(xiàn)空格會(huì)怎么樣?# "VARIABLE =value" # #% 腳本將嘗試運(yùn)行一個(gè)"VARIABLE"的命令, 帶著一個(gè)"=value"參數(shù).# "VARIABLE= value" # #% 腳本將嘗試運(yùn)行一個(gè)"value"的命令, #+ 并且?guī)е粋€(gè)被賦值成""的環(huán)境變量"VARIABLE". #------------------------------------------------------------------ echo hello # 沒有變量引用, 只是個(gè)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é)果. # =============================================================== # 引用一個(gè)變量將保留其中的空白, 當(dāng)然, 如果是變量替換就不會(huì)保留了. # ===============================================================echoecho '$hello' # $hello # # 全引用的作用將會(huì)導(dǎo)致"$"被解釋為單獨(dú)的字符, #+ 而不是變量前綴.# 注意這兩種引用所產(chǎn)生的不同的效果.# 設(shè)置為空值. hello= echo "\$hello (null value) = $hello" # 注意設(shè)置一個(gè)變量為null, 與unset這個(gè)變量, 并不是一回事 #+ 雖然最終的結(jié)果相同(具體見下邊).# --------------------------------------------------------------# 可以在同一行上設(shè)置多個(gè)變量, #+ 但是必須以空白進(jìn)行分隔. # 慎用, 這么做會(huì)降低可讀性, 并且不可移植.var1=21 var2=22 var3=$V3 echo echo "var1=$var1 var2=$var2 var3=$var3"# 在老版本的"sh"上可能會(huì)引起問題.# --------------------------------------------------------------echo; echonumbers="one two three" # other_numbers="1 2 3" ## 如果在變量中存在空白, If there is whitespace embedded within a variable, #+ 那么就必須加上引用. # other_numbers=1 2 3 # 給出一個(gè)錯(cuò)誤消息. 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= # 聲明, 但是沒有初始化這個(gè)變量,#+ 其實(shí)和前邊設(shè)置為空值的作用是一樣的. echo "uninitialized_variable = $uninitialized_variable"# 還是一個(gè)空值.uninitialized_variable=23 # 賦值. unset uninitialized_variable # Unset這個(gè)變量. echo "uninitialized_variable = $uninitialized_variable"# 還是一個(gè)空值. echoexit 0像C語言中的變量一樣,一個(gè)未初始化的變量將會(huì)是null值 - 就是未賦值(但并不代表值是0),在給變量 賦值之前就使用這個(gè)變量通常會(huì)引起問題。
小知識(shí)加油站–trap
trap的格式如下,功能就是捕捉信號(hào),并對(duì)信號(hào)進(jìn)行處理
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可以是以下的一個(gè)或多個(gè)
- 定義在<signal.h>中的信號(hào)名或者數(shù)值。信號(hào)名的大小寫不敏感,SIG這個(gè)前綴也是可選的。以下的命令的效果都是一樣的
調(diào)試腳本時(shí),trap經(jīng)常用到的信號(hào)量
- EXIT:在shell退出前執(zhí)行trap設(shè)置的命令,也可以指定為0
- RETURN:在.和``source執(zhí)行其他腳本返回時(shí),執(zhí)行trap`設(shè)置的命令
- DEBUG:在任何命令執(zhí)行前執(zhí)行trap設(shè)置的命令,但對(duì)于函數(shù)僅在函數(shù)的第一條命令前執(zhí)行一次
- ERR:在命令結(jié)果為非0時(shí),執(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 不管你信不信,這是一個(gè)函數(shù)- trap -l:列出所有信號(hào)的數(shù)值和名字,類似于kill -l
- trap -p:列出通過trap設(shè)置過的信號(hào)處理命令
注意
- 在函數(shù)中設(shè)置的trap也是全局生效的
- 對(duì)于同一個(gè)信號(hào),只有最后一次trap生效
- trap只在本進(jìn)程內(nèi)有效,它的子進(jìn)程不會(huì)繼承trap的設(shè)置。
使用trap設(shè)計(jì)一個(gè)用于反應(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是在退出的時(shí)候清理程序時(shí)調(diào)用的 exit 0總結(jié)
以上是生活随笔為你收集整理的shell--变量的替换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: trap--shell脚本调试的不二人选
- 下一篇: 作者:刘建楠(1963-),男,就职于中