最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Shell編程之特殊變量和擴(kuò)展變量詳解

 更新時(shí)間:2018年11月12日 09:25:02   作者:Surpassme  
這篇文章主要給大家介紹了關(guān)于Shell編程教程之特殊變量和擴(kuò)展變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用shell具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

特殊變量

在Shell中的特殊變量主要分別兩種位置參數(shù)變量、狀態(tài)變量兩種。

位置參數(shù)變量

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

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

當(dāng)"∗"和"∗"和"@"都添加雙引號時(shí),兩者的功能有所區(qū)別;如不加,則功能相同,無區(qū)別。

位置參數(shù)變量示例

1、示例一:

[root@localhost Test]# cat para.sh
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
echo '$0 is:' $0
echo '$1 is:' $1
echo '$12 is:' ${12}
echo '$# is:' $#
echo '$* is:' $*
echo '"$*"is:' "$*"
echo '$@ is:' $@
echo '"$@"is:' "$@"
# 輸出結(jié)果
[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、傳入的參數(shù)個(gè)數(shù)多于腳本定義的參數(shù)時(shí),則多出的參數(shù)會忽略

2、傳入的參數(shù)中如使用雙引號,則會當(dāng)作一個(gè)參數(shù)值進(jìn)行傳遞

3、位置參數(shù)如大于9,需要使用${}進(jìn)行傳遞

2、示例二:

[root@localhost Test]# cat testposition.sh 
#!/bin/bash
echo '$# $1 $2 $3 $* $@'
echo $# $1 $2 $3 $* $@
echo "************"
echo '$*'
for tmp in $*
 do
 echo $tmp
 done
echo "************"
echo "@@@@@@@@@@@@"
echo '$@'
for temp in $@
 do
 echo $temp
 done
echo "@@@@@@@@@@@@"

echo '"*"*"*"*"*"*'

echo '$*'
for i in "$*"
 do
 echo $i
 done
echo '"*"*"*"*"*"*'

echo '"@"@"@"@"@"@'

echo '$@'
for j in "$@"
 do
 echo $j
 done
echo '"@"@"@"@"@"@'

[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
************
$* # 未加雙引號,所以會輸出全部參數(shù),則第一個(gè)和第三個(gè)參數(shù)會拆開
Hello
Jack
Welcome
to
Shanghai
************
@@@@@@@@@@@@
$@ # 未加雙引號,所以會輸出全部參數(shù),則第一個(gè)和第三個(gè)參數(shù)會拆開
Hello
Jack
Welcome
to
Shanghai
@@@@@@@@@@@@
"*"*"*"*"*"*
$* # 添加雙引號后,傳入的參數(shù)全部當(dāng)一個(gè)參數(shù)進(jìn)行輸出
Hello Jack Welcome to Shanghai
"*"*"*"*"*"*
"@"@"@"@"@"@
$@ # 添加雙引號后,傳入的參數(shù)全部當(dāng)獨(dú)立的參數(shù)進(jìn)行輸出
Hello Jack
Welcome
to Shanghai
"@"@"@"@"@"@

狀態(tài)變量

  • $?:獲取上一個(gè)命令或腳本的執(zhí)行狀態(tài)值(0:成功,其他:失?。?/li>
  • $$:獲取當(dāng)前執(zhí)行的Shell的進(jìn)程號(PID)
  • $!:獲取上一個(gè)在后臺工作的進(jìn)程的進(jìn)程號
  • **$_**:獲取在些之前執(zhí)行的命令或腳本的最后一個(gè)參數(shù)

以上四個(gè)狀態(tài)變量,僅$?常用,其他三個(gè)了解即可。

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

1、判斷命令和腳本是否執(zhí)行成功

2、如腳本中調(diào)用exit 數(shù)字,則會返回該數(shù)字給$?

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

狀態(tài)變量示例

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/profild
ls: 無法訪問/etc/profild: 沒有那個(gè)文件或目錄
[root@localhost Test]# echo $?
2

2、$$示例:

[root@localhost Test]# cat testPID.sh
#!/bin/bash
echo $$ > /tmp/test.pid
sleep 300

[root@localhost Test]# bash testPID.sh & # 將當(dāng)前腳本調(diào)用到后臺執(zhí)行
[1] 1671
[root@localhost Test]# ps -ef | grep testPID | grep -v grep
root 1671 23706 0 16:37 pts/0 00:00:00 bash testPID.sh # 查詢PID

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

[root@localhost Test]# bash testPID.sh &
[1] 24078
[root@localhost Test]# echo $!
24078 # 打印上一次在后臺執(zhí)行的進(jìn)程號
[root@localhost Test]# ps -ef | grep testPID | grep -v grep
root 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 # 打印最后一個(gè)傳入的參數(shù)值

Bash 內(nèi)置變量

常用的內(nèi)部命令有echo、eval、exec、export、read、shift、exit。

echo

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

echo [options] args

常用參數(shù)如下所示:

參數(shù)選項(xiàng) 說明
-n 不換行輸出內(nèi)容
-e 解析轉(zhuǎn)義字符

echo常用轉(zhuǎn)義字符如下:

轉(zhuǎn)義字符 說明
\n 換行
\r 回車
\t Tab
\b 退格
\v 縱向制表符

eval

當(dāng)Shell程序運(yùn)行到eval語句時(shí),將讀入?yún)?shù)args,并將它們組合成一個(gè)新的命令而后執(zhí)行。其命令格式如下所示:

eval args

exec

exec主要用于在不創(chuàng)建新的子進(jìn)程的情況下,轉(zhuǎn)而執(zhí)行指定的命令,當(dāng)指定命令執(zhí)行完后,則終止該進(jìn)程。其命令格式如下所示:

exec args

當(dāng)使用exec打開文件后,read命令每次都會將文件指針移動(dòng)到下一行進(jìn)行讀取,直至結(jié)束。因此常用來處理文件內(nèi)容。

read

從標(biāo)準(zhǔn)輸入讀取變量或字符串等信息并傳遞給其他變量,其命令格式如下所示

read args

shift

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

shift postition args

shift如果不帶參數(shù),則默認(rèn)左移1位

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

exit

常用于退出Shell,在日常使用過程中可使用exit num來自定義返回狀態(tài)數(shù)。

Bash 內(nèi)置變量示例

1、echo

[root@localhost Test]# echo "Test";echo "Dao"
Test
Dao
[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/bash

echo "No eval"
echo \$$#
echo "Add eval"
eval echo \$$#

[root@localhost Test]# bash eval.sh a b
No eval
$2 # 未添加evel時(shí),$#為2,則輸出$2
Add eval
b # 添加evel后,則重新對傳入的參數(shù)進(jìn)行解析,則輸出傳入的第2個(gè)參數(shù)

3、exec

[root@localhost Test]# exec ls
eval.sh para.sh ping.sh testPID.sh testposition.sh
[admin@localhost ~]$ # 在執(zhí)行exec后則終止當(dāng)前Shell進(jìn)程,因此從root用戶退出到普通用戶
# 與read一起讀取文件
[root@localhost ~]# seq 5 > /tmp/rand.log
[root@localhost ~]# cat /tmp/rand.log 
1
2
3
4
5
[root@localhost Test]# cat exec.sh
#!/bin/bash
exec < /tmp/rand.log
while read line
 do
 echo $line
 done
echo "Completed"

[root@localhost Test]# bash exec.sh
1
2
3
4
5
Completed

4、read

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

5、shift

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

變量擴(kuò)展

變量擴(kuò)展說明

Shell中變量擴(kuò)展說明如下所示:

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

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

變量擴(kuò)展示例

[root@localhost init.d]# var="This is test string"
[root@localhost init.d]# echo $var
This is test string
[root@localhost init.d]# echo ${var}
This is test string
[root@localhost init.d]# echo ${#var} # 統(tǒng)計(jì)字符長度
19
[root@localhost init.d]# echo ${var:5} # 從第5個(gè)位置開始截取字符
is test string
[root@localhost init.d]# echo ${var:5:2} # 從第5個(gè)位置開始截取2個(gè)字符
is
[root@localhost init.d]# echo ${var#This} # 從開頭刪除最短匹配的字符 is
is test string
[root@localhost init.d]# echo ${var##This} # 從開頭刪除最長匹配的字符 is
is test string
[root@localhost init.d]# echo ${var%g} # 從結(jié)尾刪除最短匹配的字符 is
This is test strin
[root@localhost init.d]# echo ${var%%g} # 從結(jié)尾刪除最長匹配的字符 is
This is test strin
[root@localhost init.d]# echo ${var/is/newis} # 替換第一個(gè)匹配的字符
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} # 變量為空,返回UNDEFINE
UNDEFINE
[root@localhost init.d]# centos="CentOS"
[root@localhost init.d]# echo ${centos:-UNDEFINE} # 變量已經(jīng)定義,返回變量本身的值
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 $result
UNDEFINE
[root@localhost init.d]# echo $centos # 變量值為空,則將UNDEFINE賦值給centos
UNDEFINE
[root@localhost init.d]# unset centos
[root@localhost init.d]# echo ${centos:?can not find variable centos}

-bash: centos: can not find variable centos # 變量值為空,輸出自定義錯(cuò)誤信息

[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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • linux下文件描述符限制問題

    linux下文件描述符限制問題

    這篇文章主要介紹了linux下文件描述符限制問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Shell中取今天、昨天、前天的時(shí)間操作代碼

    Shell中取今天、昨天、前天的時(shí)間操作代碼

    這篇文章主要介紹了Shell中取今天昨、昨天、前天的時(shí)間操作代碼,需要的朋友可以參考下
    2014-12-12
  • linux目錄管理方法介紹

    linux目錄管理方法介紹

    這篇文章介紹了linux目錄管理的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 深入淺出Shell編程 Shell變量介紹

    深入淺出Shell編程 Shell變量介紹

    先不要管Shell的版本,來看看Shell 變量,在Shell中有三種變量:系統(tǒng)變量,環(huán)境變量,用戶變量。其中用戶變量在編程過程中使用最多,系統(tǒng)變量在對參數(shù)判斷和命令返回值判斷會使用,環(huán)境變量主要是在程序運(yùn)行的時(shí)候需要設(shè)置。
    2013-01-01
  • Ubuntu用戶之間相互切換方法(推薦)

    Ubuntu用戶之間相互切換方法(推薦)

    下面小編就為大家?guī)硪黄猆buntu用戶之間相互切換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 如何利用shell開發(fā)keepalived啟動(dòng)腳本

    如何利用shell開發(fā)keepalived啟動(dòng)腳本

    Keepalived軟件起初是專為LVS負(fù)載均衡軟件設(shè)計(jì)的,用來管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后來又加入了可以實(shí)現(xiàn)高可用的VRRP功能。這篇文章主要介紹了使用shell開發(fā)keepalived啟動(dòng)腳本,需要的朋友可以參考下
    2020-03-03
  • 一個(gè)簡單的linux命令 cp

    一個(gè)簡單的linux命令 cp

    這篇文章主要介紹了一個(gè)簡單的linux命令cp,cp命令用來復(fù)制文件或者目錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • ssh(ssh-keygen)配置免輸入密碼登錄遠(yuǎn)程主機(jī)的方法

    ssh(ssh-keygen)配置免輸入密碼登錄遠(yuǎn)程主機(jī)的方法

    這篇文章主要是介紹ssh(ssh-keygen)配置免輸入密碼登錄遠(yuǎn)程主機(jī)的方法,供大家學(xué)習(xí)參考
    2013-02-02
  • Shell腳本實(shí)現(xiàn)檢測某ip網(wǎng)絡(luò)暢通情況(含短信報(bào)警功能)

    Shell腳本實(shí)現(xiàn)檢測某ip網(wǎng)絡(luò)暢通情況(含短信報(bào)警功能)

    這篇文章主要介紹了Shell腳本實(shí)現(xiàn)檢測某ip網(wǎng)絡(luò)暢通情況(含短信報(bào)警功能),本文腳本針對一個(gè)服務(wù)器IP進(jìn)行檢查,也可改造一下,執(zhí)行個(gè)多個(gè)IP的檢查,需要的朋友可以參考下
    2014-12-12
  • Shell中統(tǒng)計(jì)字符串中單詞的個(gè)數(shù)的幾種方法

    Shell中統(tǒng)計(jì)字符串中單詞的個(gè)數(shù)的幾種方法

    今天小編就為大家分享一篇關(guān)于Shell中統(tǒng)計(jì)字符串中單詞的個(gè)數(shù)的幾種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

依兰县| 黑山县| 保德县| 兴仁县| 丘北县| 鹿泉市| 苗栗市| 特克斯县| 涿州市| 河北区| 留坝县| 北碚区| 平远县| 兴化市| 天气| 金川县| 濮阳县| 兴和县| 当雄县| 龙岩市| 安康市| 永新县| 高邑县| 冷水江市| 建湖县| 浦县| 巴彦淖尔市| 阳江市| 科技| 日照市| 蒲城县| 靖宇县| 合山市| 甘孜| 桐庐县| 郧西县| 铜川市| 右玉县| 涡阳县| 遵义县| 安塞县|