偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Shell 腳本中常用的內(nèi)置變量 你知道嗎?

系統(tǒng) Linux
在 Bash 解釋器中,內(nèi)置了許多變量,這些變量的功能是解釋器自帶的,我們?cè)诰帉憇hell腳本時(shí)如果能靈活的使用它們,對(duì)腳本的編寫效率以及差錯(cuò)大有幫助, 下面一一介紹這些變量。

 [[354150]]

本文轉(zhuǎn)載自微信公眾號(hào)「Linux開發(fā)那些事兒」,作者LinuxThings。轉(zhuǎn)載本文請(qǐng)聯(lián)系Linux開發(fā)那些事兒公眾號(hào)。  

在 Bash 解釋器中,內(nèi)置了許多變量,這些變量的功能是解釋器自帶的,我們?cè)诰帉憇hell腳本時(shí)如果能靈活的使用它們,對(duì)腳本的編寫效率以及差錯(cuò)大有幫助, 下面一一介紹這些變量

$FUNCNAME、$LINENO、$PWD

FUNCNAME和LINENO 變量經(jīng)常用于腳本的調(diào)試

FUNCNAME 表示當(dāng)前函數(shù)的名字,作用范圍僅限函數(shù)中使用,在函數(shù)外無值

LINENO 表示當(dāng)前所在腳本中變量出現(xiàn)在的行號(hào)

PWD 表示當(dāng)前目錄, 對(duì)應(yīng)于 pwd命令

現(xiàn)有個(gè)腳本 a.sh 內(nèi)容如下

  1. 1 #!/bin/bash 
  2.  2 
  3.  3  
  4.  4 testa() 
  5.  5 { 
  6.  6  echo 'func='$FUNCNAME,$LINENO 
  7.  7 } 
  8.  8  
  9.  9  
  10. 10 testa 
  11. 11  
  12. 12 echo 'lineno:'$LINENO 
  13. 13 echo 'xx:'$FUNCNAME 
  14. 14 echo 'curpath:'$PWD 

執(zhí)行 ./a.sh 命令, 輸出如下

  1. [tt@ecs-centos-7 ~]$ ./a.sh  
  2. func=testa,6 
  3. lineno:12 
  4. xx: 
  5. curpath:/home/tt 

在 testa 函數(shù)中 FUNCNAME 變量值是 testa,也即函數(shù)名字,在函數(shù)外部無值

LINENO 變量無論是在函數(shù)中還是函數(shù)外,都表示當(dāng)前所在的行號(hào)

$$、$PPID

這兩個(gè)變量依次表示當(dāng)前進(jìn)程ID和父進(jìn)程ID

現(xiàn)有 a.sh 腳本,內(nèi)容如下

sleep 20 睡眠語句是為了讓執(zhí)行腳本進(jìn)程暫緩?fù)顺?,在另一個(gè)終端中驗(yàn)證輸出的結(jié)果

  1. #!/bin/bash 
  2. #set -u 
  3.  
  4. echo 'cur pid:'$$ 
  5. echo 'parent pid:'$PPID 
  6. sleep 20 

在當(dāng)前終端執(zhí)行 ./a.sh,結(jié)果如下

  1. [tt@ecs-centos-7 ~]$ ./a.sh  
  2. cur pid:13095 
  3. parent pid:12982 

在執(zhí)行a.sh的腳本進(jìn)程退出之前,打開另一個(gè)終端,執(zhí)行 ps -o pid,ppid,time,cmd -p 12982,13095 命令,結(jié)果如下

  1. [tt@ecs-centos-7 ~]$ ps -o pid,ppid,time,cmd -p 12982,13095 
  2.   PID  PPID     TIME CMD 
  3. 12982 12981 00:00:00 -bash 
  4. 13095 12982 00:00:00 /bin/bash ./a.sh 

從上面的結(jié)果可以看出, 執(zhí)行 ./a.sh 命令之后,$$ 變量表示的是 執(zhí)行a.sh腳本的進(jìn)程ID 13095 ,而 12982 是它的父進(jìn)程ID,也即是 PPID變量的值,它是當(dāng)前bash的實(shí)例

$0,$1,$2...$n、$#

$# 表示從命令行傳入腳本的參數(shù)數(shù)量

$0,$1,$2...$n 是從命令行傳遞到腳本的參數(shù) $0 是腳本本身的名字 $1 是第一個(gè)參數(shù) $2 是第二個(gè)參數(shù),依此類推 $n 是第n個(gè)參數(shù)

第十個(gè)參數(shù)及以后的參數(shù)必須要用大括號(hào)括起來,例如: ${10}、${11}、${12} 依次表示第十個(gè)變量、第十一個(gè)變量、第十二個(gè)變量

$*、$@

都表示位置參數(shù),不過它們之間也有些不同點(diǎn)

使用 $* 時(shí),如果加上雙引號(hào),即 "$* " 的形式,那所有位置的參數(shù)會(huì)被當(dāng)作一個(gè)單詞來處理,如果不包含雙引號(hào),即 $* 的形式,則每個(gè)位置的參數(shù)都被當(dāng)作一個(gè)獨(dú)立的單詞來處理

而對(duì)于 $@,無論是否加上雙引號(hào),每個(gè)位置的參數(shù)都被當(dāng)作一個(gè)獨(dú)立的單詞來處理

現(xiàn)有c.sh, 內(nèi)容如下

  1. #!/bin/bash 
  2.  
  3. cnt=1 
  4. echo 'test 1111' 
  5.  
  6. for var in "$*" 
  7. do 
  8.    echo "arg$cnt="$var 
  9.    let "cnt+=1" 
  10. done 
  11. echo 
  12.  
  13. cnt=1 
  14. echo 'test 2222' 
  15. for var in $* 
  16. do 
  17.   echo "arg$cnt="$var 
  18.   let "cnt+=1" 
  19. done 
  20. echo 
  21.  
  22. cnt=1 
  23. echo 'test 3333' 
  24. for var in "$@" 
  25. do 
  26.   echo "arg$cnt="$var 
  27.   let "cnt+=1" 
  28. done 
  29. echo 
  30.  
  31. cnt=1 
  32. echo "test 4444" 
  33. for var in $@ 
  34. do 
  35.  echo "arg$cnt="$var 
  36.  let "cnt+=1" 
  37. done 

執(zhí)行 ./c.sh 1 2 3,結(jié)果如下

  1. [root@ecs-centos-7 ~]# ./c.sh 1 2 3 
  2. test 1111 
  3. arg1=1 2 3 
  4.  
  5. test 2222 
  6. arg1=1 
  7. arg2=2 
  8. arg3=3 
  9.  
  10. test 3333 
  11. arg1=1 
  12. arg2=2 
  13. arg3=3 
  14.  
  15. test 4444 
  16. arg1=1 
  17. arg2=2 
  18. arg3=3 

從上面的結(jié)果可以看出,對(duì)于 $* 來說,加了雙引號(hào)之后所有位置參數(shù)就會(huì)被視為一個(gè)單詞

對(duì)于 $@ 來說,是否加雙引號(hào),結(jié)果都是一樣的

所以,僅在使用雙引號(hào)時(shí),$*和 $@ 才會(huì)有差異

$?

命令、函數(shù)或者腳本的退出狀態(tài),在判斷命令的執(zhí)行結(jié)果或者函數(shù)的調(diào)用結(jié)果時(shí)很有用處

現(xiàn)有 e.sh 和 f.sh 測試腳本

e.sh 腳本

  1. #!/bin/bash 
  2.  
  3. test_func() 
  4.   if [[ $1 -eq 10 ]]; then 
  5.         return 5 
  6.   fi 
  7.   return 6 
  8.  
  9.  
  10. if [ $# -ge 1 ]; then 
  11.    name="$1" 
  12.    shift 1 
  13.    $name "$@" 
  14. fi 

f.sh 腳本

  1. #!/bin/bash 
  2.  
  3.  
  4. sh e.sh test_func 3 
  5. echo 'exit code1:'$? 
  6.  
  7. sh e.sh test_func 10 
  8. echo 'exit code2:'$? 
  9.  
  10. test -f $PWD/xx.txt 
  11. echo 'exit code3:'$? 
  12.  
  13. test -f $PWD/e.sh 
  14. echo 'exit code4:'$? 

執(zhí)行 ./f.sh 命令,結(jié)果如下

  1. [root@ecs-centos-7 ~]# ./f.sh  
  2. exit code1:6 
  3. exit code2:5 
  4. exit code3:1 
  5. exit code4:0 

腳本 e.sh 中 test_func 函數(shù)功能是:當(dāng)參數(shù)等于10時(shí),退出狀態(tài)為 5,否則為 6

sh e.sh test_func 3 命令會(huì)調(diào)用 e.sh 腳本中的 test_func函數(shù),傳入?yún)?shù)是 3,所以退出狀態(tài)為 6,同理可知, sh e.sh test_func 10 命令的退出狀態(tài)是 5

在Linux中,命令執(zhí)行成功,退出狀態(tài)為 0 ,失敗則為非 0

test -f $PWD/xx.txt 命令是檢查當(dāng)前目錄是否存在 xx.txt 文件,因當(dāng)前目錄并不存在 xx.txt,所以命令執(zhí)行失敗,退出狀態(tài)為非 0

由于e.sh 存在于當(dāng)前目錄下,所以 test -f $PWD/e.sh 命令執(zhí)行成功,退出狀態(tài)為 0

$IFS

此變量用于 Bash 識(shí)別字符串或單詞邊界,默認(rèn)值是空格,腳本中根據(jù)需要可以修改此變量的值

現(xiàn)有 b.sh腳本,內(nèi)容如下

  1. #!/bin/bash 
  2.  
  3. va="a:b:c" 
  4. vb="x-y-z" 
  5. vc="e,f,g" 
  6.  
  7. IFS=":" 
  8. echo 'va:'$va 
  9. echo 'vb:'$vb 
  10. echo 'vc:'$vc 
  11.  
  12. echo 
  13.  
  14. IFS="-" 
  15. echo 'va:'$va 
  16. echo 'vb:'$vb 
  17. echo 'vc:'$vc 
  18.  
  19. echo 
  20.  
  21. IFS="," 
  22. echo 'va:'$va 
  23. echo 'vb:'$vb 
  24. echo 'vc:'$vc 

執(zhí)行 ./b.sh 結(jié)果如下

  1. [tt@ecs-centos-7 ~]$ ./b.sh  
  2. va:a b c 
  3. vb:x-y-z 
  4. vc:e,f,g 
  5.  
  6. va:a:b:c 
  7. vb:x y z 
  8. vc:e,f,g 
  9.  
  10. va:a:b:c 
  11. vb:x-y-z 
  12. vc:e f g 

從結(jié)果可以看出,當(dāng) $IFS 為 : 時(shí),字符串 "a:b:c"被解析成 a b c

當(dāng) $IFS 為 - 時(shí),字符串 "x-y-z"被解析成 x y z

當(dāng) $IFS 為 , 時(shí),字符串 "e,f,g"被解析成 e f g

$HOME、$USER、$UID、$GROUPS

  1. HOME:   用戶home目錄 
  2. USER:   當(dāng)前用戶名 
  3. UID:    當(dāng)前用戶ID 
  4. GROUPS: 當(dāng)前用戶組ID 
  1. [tt@ecs-centos-7 ~]$ echo $HOME 
  2. /home/tt 
  3. [tt@ecs-centos-7 ~]$ echo $USER 
  4. tt 
  5. [tt@ecs-centos-7 ~]$ echo $UID 
  6. 1003 
  7. [tt@ecs-centos-7 ~]$ echo $GROUPS 
  8. 1003 

$HOSTTYPE、$MACTYPE、$OSTYPE

這些變量都表示系統(tǒng)硬件

  1. [tt@ecs-centos-7 ~]$ echo $HOSTTYPE 
  2. x86_64 
  3. [tt@ecs-centos-7 ~]$ echo $MACHTYPE 
  4. x86_64-redhat-linux-gnu 
  5. [tt@ecs-centos-7 ~]$ echo $OSTYPE 
  6. linux-gnu 

小結(jié)

本文介紹了一些常用的 Bash 內(nèi)置變量,對(duì)于一些生僻或者平常很少用到的變量可以自行查閱相關(guān)資料

 

責(zé)任編輯:武曉燕 來源: Linux開發(fā)那些事兒
相關(guān)推薦

2024-06-12 08:05:06

2022-03-10 08:25:27

JavaScrip變量作用域

2020-10-08 18:58:46

條件變量開發(fā)線程

2024-02-19 00:00:00

Console函數(shù)鏈接庫

2020-12-24 15:26:07

Redis數(shù)據(jù)庫

2021-09-13 19:28:42

JavaNetty開發(fā)

2023-12-12 08:41:01

2018-09-07 15:23:16

2024-11-01 10:48:01

C#WPF程序

2021-10-14 06:52:47

算法校驗(yàn)碼結(jié)構(gòu)

2022-09-29 15:32:58

云計(jì)算計(jì)算模式

2024-09-18 07:00:00

消息隊(duì)列中間件消息隊(duì)列

2019-12-12 09:23:29

Hello World操作系統(tǒng)函數(shù)庫

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2023-04-26 10:21:04

2024-04-30 09:02:48

2023-12-20 08:23:53

NIO組件非阻塞

2010-03-26 15:28:05

Python編寫

2014-05-30 10:23:15

樂跑手環(huán)智能手環(huán)運(yùn)動(dòng)手環(huán)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)