亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

Shell編程之特殊變量和擴展變量詳解

2020-07-27 18:46:25
字體:
來源:轉載
供稿:網友

特殊變量

在Shell中的特殊變量主要分別兩種位置參數變量、狀態變量兩種。

位置參數變量

Shell中的位置參數變量主要是指0、0、1、$#等,主要用于從命令行、函數或腳本執行等地方傳遞參數。詳細說明如下所示:

  • $0:獲取當前執行的Shell腳本的文件名,如腳本中包含路徑,則輸出也包括路徑
  • $n:獲取當前執行的Shell腳本的第n個參數值,如n>9,則需要使用用大括號,如${10},各參數間用空格進行分隔
  • $#:獲取當前執行的Shell腳本傳入參數的總個數
  • $*:獲取當前執行的Shell所有傳入參數,如不加引號則與$@功能相同,如果添加雙引號**"∗",則表示將所有傳入參數視為單個字符串∗∗,相當于"∗",則表示將所有傳入參數視為單個字符串∗∗,相當于"1 223"
  • $@:獲取當前執行的Shell所有傳入參數,**如不加引號則與$*功能相同,如果添加雙引號"@",則表示將所有傳入參數視為獨立的字符串∗∗,相當于"@",則表示將所有傳入參數視為獨立的字符串∗∗,相當于"1" "2""2""3"

當"∗"和"∗"和"@"都添加雙引號時,兩者的功能有所區別;如不加,則功能相同,無區別。

位置參數變量示例

1、示例一:

[root@localhost Test]# cat para.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}echo '$0 is:' $0echo '$1 is:' $1echo '$12 is:' ${12}echo '$# is:' $#echo '$* is:' $*echo '"$*"is:' "$*"echo '$@ is:' $@echo '"$@"is:' "$@"# 輸出結果[root@localhost Test]# bash ~/Test/para.sh {a..z}a b c d e f g h i j k l m n o$0 is: /root/Test/para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z

1、傳入的參數個數多于腳本定義的參數時,則多出的參數會忽略

2、傳入的參數中如使用雙引號,則會當作一個參數值進行傳遞

3、位置參數如大于9,需要使用${}進行傳遞

2、示例二:

[root@localhost Test]# cat testposition.sh #!/bin/bashecho '$# $1 $2 $3 $* $@'echo $# $1 $2 $3 $* $@echo "************"echo '$*'for tmp in $* do echo $tmp doneecho "************"echo "@@@@@@@@@@@@"echo '$@'for temp in $@ do echo $temp doneecho "@@@@@@@@@@@@"echo '"*"*"*"*"*"*'echo '$*'for i in "$*" do echo $i doneecho '"*"*"*"*"*"*'echo '"@"@"@"@"@"@'echo '$@'for j in "$@" do echo $j doneecho '"@"@"@"@"@"@'[root@localhost Test]# bash testposition.sh "Hello Jack" Welcome "to Shanghai"$# $1 $2 $3 $* $@3 Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai************$* # 未加雙引號,所以會輸出全部參數,則第一個和第三個參數會拆開HelloJackWelcometoShanghai************@@@@@@@@@@@@$@ # 未加雙引號,所以會輸出全部參數,則第一個和第三個參數會拆開HelloJackWelcometoShanghai@@@@@@@@@@@@"*"*"*"*"*"*$* # 添加雙引號后,傳入的參數全部當一個參數進行輸出Hello Jack Welcome to Shanghai"*"*"*"*"*"*"@"@"@"@"@"@$@ # 添加雙引號后,傳入的參數全部當獨立的參數進行輸出Hello JackWelcometo Shanghai"@"@"@"@"@"@

狀態變量

  • $?:獲取上一個命令或腳本的執行狀態值(0:成功,其他:失?。?/li>
  • $$:獲取當前執行的Shell的進程號(PID)
  • $!:獲取上一個在后臺工作的進程的進程號
  • **$_**:獲取在些之前執行的命令或腳本的最后一個參數

以上四個狀態變量,僅$?常用,其他三個了解即可。

在日常使場景中,$?主要用法如下所示:

1、判斷命令和腳本是否執行成功

2、如腳本中調用exit 數字,則會返回該數字給$?

3、如在函數中,則可以通過return 數字將該數字返回給$?

狀態變量示例

1、$?示例:

[root@localhost Test]# ll /etc/profile-rw-r--r--. 1 root root 1819 4月 11 2018 /etc/profile[root@localhost Test]# echo $?0[root@localhost Test]# ll /etc/profildls: 無法訪問/etc/profild: 沒有那個文件或目錄[root@localhost Test]# echo $?2

2、$$示例:

[root@localhost Test]# cat testPID.sh#!/bin/bashecho $$ > /tmp/test.pidsleep 300[root@localhost Test]# bash testPID.sh & # 將當前腳本調用到后臺執行[1] 1671[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 1671 23706 0 16:37 pts/0 00:00:00 bash testPID.sh # 查詢PID

3、!示例:!示例:!功能類似于$$,只不過是獲取上一次執行腳本的PID

[root@localhost Test]# bash testPID.sh &[1] 24078[root@localhost Test]# echo $!24078 # 打印上一次在后臺執行的進程號[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 24078 23706 0 16:42 pts/0 00:00:00 bash testPID.sh

4、$_示例:

[root@localhost Test]# bash para.sh {a..z}a b c d e f g h i j k l m n o$0 is: para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z[root@localhost Test]# echo $_z # 打印最后一個傳入的參數值

Bash 內置變量

常用的內部命令有echo、eval、exec、export、read、shift、exit。

echo

主要用于打印信息,其命令格式如下所示:

echo [options] args

常用參數如下所示:

參數選項 說明
-n 不換行輸出內容
-e 解析轉義字符

echo常用轉義字符如下:

轉義字符 說明
/n 換行
/r 回車
/t Tab
/b 退格
/v 縱向制表符

eval

當Shell程序運行到eval語句時,將讀入參數args,并將它們組合成一個新的命令而后執行。其命令格式如下所示:

eval args

exec

exec主要用于在不創建新的子進程的情況下,轉而執行指定的命令,當指定命令執行完后,則終止該進程。其命令格式如下所示:

exec args

當使用exec打開文件后,read命令每次都會將文件指針移動到下一行進行讀取,直至結束。因此常用來處理文件內容。

read

從標準輸入讀取變量或字符串等信息并傳遞給其他變量,其命令格式如下所示

read args

shift

對傳入的位置參數依次向左移動一個位置,并使用位置參數$#減1,直至0為止。其命令格式如下所示:

shift postition args

shift如果不帶參數,則默認左移1位

如傳入的參數為112 3,如執行一次shift,則之前的3,如執行一次shift,則之前的3變成2,2,2變成1,1,1消失。

exit

常用于退出Shell,在日常使用過程中可使用exit num來自定義返回狀態數。

Bash 內置變量示例

1、echo

[root@localhost Test]# echo "Test";echo "Dao"TestDao[root@localhost Test]# echo -n "Test";echo "Dao"TestDao[root@localhost Test]# echo -e "Test/tName/n Dao"Test Name Dao

2、eval

[root@localhost Test]# cat eval.sh#!/bin/bashecho "No eval"echo /$$#echo "Add eval"eval echo /$$#[root@localhost Test]# bash eval.sh a bNo eval$2 # 未添加evel時,$#為2,則輸出$2Add evalb # 添加evel后,則重新對傳入的參數進行解析,則輸出傳入的第2個參數

3、exec

[root@localhost Test]# exec lseval.sh para.sh ping.sh testPID.sh testposition.sh[admin@localhost ~]$ # 在執行exec后則終止當前Shell進程,因此從root用戶退出到普通用戶# 與read一起讀取文件[root@localhost ~]# seq 5 > /tmp/rand.log[root@localhost ~]# cat /tmp/rand.log 12345[root@localhost Test]# cat exec.sh#!/bin/bashexec < /tmp/rand.logwhile read line do echo $line doneecho "Completed"[root@localhost Test]# bash exec.sh12345Completed

4、read

可以參考公眾號中read命令一文

5、shift

[root@localhost Test]# cat shift.sh#!/bin/bashecho $1 $2 $3 $4 $5until [ -z $1 ]do echo $@ shift 1done[root@localhost Test]# bash shift.sh {1..5}1 2 3 4 51 2 3 4 52 3 4 53 4 54 55

變量擴展

變量擴展說明

Shell中變量擴展說明如下所示:

  • ${var}:返回${var}的內容
  • ${#var}:返回${var}的字符長度
  • ${var:offset}:返回${var}從位置offset之后開始提取字符至結束
  • ${var:offset:length}:返回${var}從offset之后,提取長度為length的字符
  • ${var#word}:返回從${var}開頭開始刪除最短匹配的word子符串
  • ${var##word}:返回從${var}開頭開始刪除最長匹配的word子符串
  • ${var%word}:返回從${var}結尾開始刪除最短匹配的word子符串
  • ${var%%word}:返回從${var}結尾開始刪除最長匹配的word子符串
  • ${var/oldstring/newstring}:使用newstring替換第一個匹配的字符oldstring
  • ${var//oldstring/newstring}:使用newstring替換所有匹配的字符oldstring
  • ${var:-word}:如果變量var的值為空或未賦值,則將word做為返回值,常用于防止變量為空或未定義而導致的異常
  • ${var:=word}:如果變量var的值為空或未賦值,則將word賦值給var并返回其值。
  • ${var:?word}:如果變量var的值為空或未賦值,則將word做為標準錯誤輸出,否則則輸出變量的值,常用于捕捉因變量未定義而導致的錯誤并退出程序
  • ${var:+word}:如果變量var的值為空或未賦值,則什么都不做,否則word字符將替換變量的值

其中${var:-word}、${var:=word}、${var:?word}、${var:+word}中的冒號也可以省略,則將變量為空或未賦值修改為未賦值,去掉了為空的檢測, 即運算符僅檢測變量是否未賦值

變量擴展示例

[root@localhost init.d]# var="This is test string"[root@localhost init.d]# echo $varThis is test string[root@localhost init.d]# echo ${var}This is test string[root@localhost init.d]# echo ${#var} # 統計字符長度19[root@localhost init.d]# echo ${var:5} # 從第5個位置開始截取字符is test string[root@localhost init.d]# echo ${var:5:2} # 從第5個位置開始截取2個字符is[root@localhost init.d]# echo ${var#This} # 從開頭刪除最短匹配的字符 isis test string[root@localhost init.d]# echo ${var##This} # 從開頭刪除最長匹配的字符 isis test string[root@localhost init.d]# echo ${var%g} # 從結尾刪除最短匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var%%g} # 從結尾刪除最長匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var/is/newis} # 替換第一個匹配的字符Thnewis is test string[root@localhost init.d]# echo ${var//is/newis} # 替換所有匹配到的字符Thnewis newis test string[root@localhost init.d]# echo $centos # 變量未定義[root@localhost init.d]# echo ${centos:-UNDEFINE} # 變量為空,返回UNDEFINEUNDEFINE[root@localhost init.d]# centos="CentOS"[root@localhost init.d]# echo ${centos:-UNDEFINE} # 變量已經定義,返回變量本身的值CentOS[root@localhost init.d]# unset centos # 取消變量值[root@localhost init.d]# echo $centos[root@localhost init.d]# result=${centos:=UNDEFINE}[root@localhost init.d]# echo $resultUNDEFINE[root@localhost init.d]# echo $centos # 變量值為空,則將UNDEFINE賦值給centosUNDEFINE[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:?can not find variable centos}-bash: centos: can not find variable centos # 變量值為空,輸出自定義錯誤信息[root@localhost init.d]# centos="IS DEFINED"[root@localhost init.d]# echo ${centos:?can not find variable centos}IS DEFINED  #變量值已定義,則輸出變量值[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:+do nothing} # 變量值為空,什么都不操作輸出[root@localhost init.d]# centos="do"[root@localhost init.d]# echo ${centos:+do nothing} # 變量已賦值,則輸出自定義的消息do nothing

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品毛片三在线观看| 日韩免费不卡av| 精品色蜜蜜精品视频在线观看| 97碰碰碰免费色视频| 欧美丝袜一区二区三区| 欧美激情xxxx| 米奇精品一区二区三区在线观看| 亚洲精品在线不卡| 久久久999精品视频| 在线观看日韩专区| 久久久久久久久久久免费| 欧美性猛交xxxx黑人猛交| 日韩电影大片中文字幕| www.美女亚洲精品| 国产一区二区三区在线播放免费观看| 欧美另类99xxxxx| 久久久视频在线| 97色在线观看免费视频| 日韩在线激情视频| 亚洲电影免费观看高清| 亚洲欧美激情一区| 九九热99久久久国产盗摄| 日韩风俗一区 二区| 欧美日韩成人免费| 亚洲欧美精品一区| 精品亚洲国产视频| 91精品视频在线播放| 亚洲影院污污.| 17婷婷久久www| 国产成人在线播放| 国产综合久久久久久| 亚洲一区999| 亚洲国产精品女人久久久| 久久久免费精品| 亚洲人成在线免费观看| 久久精品国产欧美激情| 亚洲欧美制服综合另类| 亚洲自拍欧美另类| 欧美亚洲国产视频| 久久伊人精品天天| 色妞欧美日韩在线| 国产精品丝袜久久久久久不卡| 亚洲嫩模很污视频| 日韩av在线天堂网| 日本成人黄色片| 欧美性猛交xxxx偷拍洗澡| 在线播放精品一区二区三区| 国产精品视频成人| 91精品久久久久久久久久久久久| 欧美华人在线视频| 亚洲国产欧美在线成人app| 欧美成人激情视频| 久久久免费在线观看| 久久精品视频va| 粉嫩av一区二区三区免费野| 久久伊人精品一区二区三区| 国产精品一香蕉国产线看观看| 日韩精品极品视频免费观看| 欧美性精品220| 日韩亚洲国产中文字幕| 久久精品国产亚洲精品2020| 日韩在线播放av| 日韩av有码在线| 午夜欧美大片免费观看| 日韩精品在线免费观看| 亚洲伊人久久大香线蕉av| 91在线精品播放| 欧美成人精品一区| 国产成人综合一区二区三区| 69视频在线播放| 国产精品久久久久免费a∨大胸| 亚洲大尺度美女在线| 国产精品美女在线| 在线观看欧美视频| 亚洲视频在线视频| 久久精品视频中文字幕| 国模私拍视频一区| 国产精品∨欧美精品v日韩精品| 高清亚洲成在人网站天堂| 日日噜噜噜夜夜爽亚洲精品| 国产精品爽爽爽爽爽爽在线观看| 深夜成人在线观看| 精品福利视频导航| 国产日韩欧美在线观看| 日本亚洲欧美成人| 日韩av在线导航| 久久久电影免费观看完整版| 亚洲黄页视频免费观看| 色阁综合伊人av| 亚洲国产欧美精品| 欧美高清性猛交| 在线播放亚洲激情| 国产一区二区三区在线观看网站| 亚洲天堂精品在线| 亚洲欧美日韩精品久久亚洲区| 亚洲欧美国产精品| 国产91色在线| 久久成年人视频| 亚洲一区av在线播放| 日韩免费观看高清| 国产精品自产拍在线观看| 亚洲女人天堂成人av在线| 久久九九精品99国产精品| 久久久久久久久国产精品| 国产视频精品va久久久久久| 成人在线中文字幕| 亚洲女人被黑人巨大进入al| 欧美久久精品午夜青青大伊人| 国产精品久久久久久久久久久不卡| 欧美一级电影在线| 日韩在线观看你懂的| 社区色欧美激情 | 精品人伦一区二区三区蜜桃免费| 国产大片精品免费永久看nba| 国产精品一区二区3区| 久久精品国产亚洲精品| 国产一区二区三区在线免费观看| 国产在线播放91| 91禁国产网站| 成人欧美一区二区三区在线湿哒哒| 国产精品视频在线播放| 91黄色8090| 亚洲aⅴ男人的天堂在线观看| 亚洲丝袜一区在线| 国产精品一区二区三区久久久| 久久久欧美一区二区| 日韩av在线免费观看一区| 日韩美女中文字幕| 日韩精品在线播放| 色偷偷偷亚洲综合网另类| 精品综合久久久久久97| 91高清视频免费观看| 国产一区二区三区日韩欧美| 国产精品永久免费在线| 久久亚洲精品国产亚洲老地址| 岛国av午夜精品| 成人在线视频网| 久久精品99国产精品酒店日本| 亚洲视频在线看| 精品国产自在精品国产浪潮| 日本一区二三区好的精华液| 一本大道亚洲视频| 亚洲国产精久久久久久久| 欧美激情视频播放| 国产成人精品在线观看| 欧美精品在线免费播放| 欧美黑人巨大xxx极品| 91chinesevideo永久地址| 久久精品国产久精国产思思| 国产精品热视频| 亚洲图中文字幕| 欧美天堂在线观看| 成年人精品视频| 欧美成人激情视频免费观看| 欧美日韩中文字幕日韩欧美| 欧美亚洲午夜视频在线观看| 最近更新的2019中文字幕| 国产精品视频在线观看| 亚洲在线视频福利| 欧美高跟鞋交xxxxhd| 91精品国产高清久久久久久久久| 中文国产亚洲喷潮| 国产在线观看91精品一区| 九九热精品视频在线播放|