日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell--变量的替换

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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í)候,那么變量可能存在如下幾種情況

  • 變量被聲明或被賦值
  • 變量被unset
  • 變量被exporte
  • 或者處在一種特殊的情況下,變量代表一種信號(hào)
  • 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è)前綴也是可選的。以下的命令的效果都是一樣的
    trap "echo SIGINT" SIGINT trap "echo SIGINT" sigint trap "echo SIGINT" 2 trap "echo SIGINT" int trap "echo SIGINT" Int

    調(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è)置的命令
    #! /bin/bash # 使用trap實(shí)現(xiàn)在每個(gè)函數(shù)開始之前打印以便打印,這樣就能準(zhǔn)確的定位到函數(shù)的位置 # 從而實(shí)現(xiàn)對(duì)腳本的調(diào)試 trap "echo before a func is called" DEBUG # 當(dāng). 或者 source 調(diào)用結(jié)束的時(shí)候出發(fā) trap "echo . or source is called " RETURN func() {echo "不管你信不信,這是一個(gè)函數(shù)"exit 0 } # 測試 echo "call ." . traptest# 函數(shù)的調(diào)用 func # DEBUG 查看調(diào)試信號(hào)是否有效的設(shè)置了 # trap -p RETURN # trap -p DEBUGexit 0

    執(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
    andrew@andrew-Thurley:~$ trap -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
    • trap -p:列出通過trap設(shè)置過的信號(hào)處理命令
    andrew@andrew-Thurley:~$ trap -p trap -- 'name ' SIGINT trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU trap -- 'name ' RETURN trap "" sigspec :忽略sigspec指定的信號(hào) trap "do something" sigspec:收到sigspec指定的信號(hào)時(shí),do some thing后,繼續(xù)執(zhí)行后續(xù)命令。 trap sigspec or trap - sigspec:恢復(fù)sigspec指定的信號(hào)的默認(rèn)行為

    注意

    • 在函數(shù)中設(shè)置的trap也是全局生效的
    #!/bin/bash # trap設(shè)置在函數(shù)中的tap也是全局有效的 foo() { trap "echo func is called" DEBUG }# 輸出 func is called foo # 調(diào)試觸發(fā) #trap -p DEBUG # 輸出trap -- 'echo func is called' SIGINT exit 0
    • 對(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。