西地那非片有依賴性嗎湘潭seo快速排名
一、?Linux shell 腳本編程中的數(shù)組概述
數(shù)組是一種常見的數(shù)據(jù)結(jié)構(gòu)。跟大多數(shù)編程語(yǔ)言一樣,大多數(shù)Linux shell腳本支持?jǐn)?shù)組,但對(duì)數(shù)組的支持程度各不相同,比如數(shù)組的維度,是支持一維數(shù)組還是多維數(shù)組?再如,數(shù)組元素的下標(biāo)是從 0 開始還是從1開始?則因shell而異,下面我們以zsh、sh、bash為例來(lái)講解。
二、數(shù)組的定義
在Linux shell腳本編程中,定義數(shù)組有兩種方法。
(一)數(shù)組名=(數(shù)值1 數(shù)值2 …… 數(shù)值n)
數(shù)值之間用空格間隔。
實(shí)例:
1.在zsh中
(1)在命令行定義
# csdn @ edu in ~ [21:37:32]?
$ a=(1 'a' b)# csdn @ edu in ~ [21:37:42]?
$ echo $a
1 a b
我們首先用命令 a=(1 'a' b)?定義了數(shù)組a
然后用命令? echo $a?顯示數(shù)組a 的元素。
(2)在腳本文件中定義
# csdn @ edu in ~ [22:20:47] C:1
$ echo 'a=(1 'a' b)' > a.sh?# csdn @ edu in ~ [22:21:31]?
$ echo 'echo $a' >> a.sh# csdn @ edu in ~ [22:21:48]?
$ cat a.sh
a=(1 a b)
echo $a# csdn @ edu in ~ [22:21:51]?
$ source ./a.sh
1 a b# csdn @ edu in ~ [22:22:01]?
$?
在上面的實(shí)例中,我們首先使用使用echo + 輸出重定向方式將數(shù)組定義語(yǔ)句 echo 'a=(1 'a' b)' > a.sh??寫入腳本文件 a.sh
然后 將 顯示數(shù)組a元素的命令 echo 'echo $a' >> a.sh?寫入腳本文件 a.sh
接下來(lái)我們使用cat命令查看腳本文件 a.sh的內(nèi)容:
a=(1 a b)
echo $a
最后,我們使用命令 source ./a.sh? 執(zhí)行腳本文件a.sh。
注意,在上面創(chuàng)建的腳本文件 a.sh中,我們沒(méi)有在第一行寫入shebang或hashbang語(yǔ)句來(lái)指定腳本解釋器。
2.在sh中
?(1)在命令行定義
[csdn ~]$ exec sh
sh-4.2$ a=(1 'a' b)
sh-4.2$ echo $a
1
sh-4.2$?
(2)在腳本文件中定義
sh-4.2$ echo 'a=(1 'a' b)' > a.sh
sh-4.2$ echo 'echo $a' >> a.sh
sh-4.2$ cat a.sh
a=(1 a b)
echo $a
sh-4.2$ . a.sh
sh: .: a.sh: file not found
sh-4.2$ source ./a.sh
1
sh-4.2$?
3.在bash中
?(1)在命令行定義
# csdn @ edu in ~ [23:27:45] C:127
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ a=(1 'a' b)
[csdn ~]$ echo $a
1
[csdn ~]$?
在bash中,數(shù)組同樣創(chuàng)建起來(lái)了,與上面不同的是,命令? echo $a 只顯示了數(shù)組中的第1個(gè)元素,而不是所有元素。?
?(2)在腳本文件中定義
[csdn ~]$ echo 'a=(1 'a' b)' > a.sh
[csdn ~]$ echo 'echo $a' >> a.sh
[csdn ~]$ cat a.sh
a=(1 a b)
echo $a
[csdn ~]$ . a.sh
1
[csdn ~]$?
與上面的在命令行定義數(shù)組一樣,bash中的命令? echo $a 只顯示了數(shù)組中的第1個(gè)元素,而不是所有元素。?
(二)數(shù)組名[下標(biāo)]=數(shù)值
1.在zsh中
(1)在命令行定義
csdn @edu in ~ b[0]=0
zsh: b: assignment to invalid subscript range
csdn @edu in ~ b[1]=1?
csdn @edu in ~ b[2]=a?
csdn @edu in ~ echo $b
1 a
csdn @edu in ~?
在上面的例子中,我們首先嘗試直接在命令行定義數(shù)組元素:b[0]=0,但是zsh提示下標(biāo)超出范圍。
接下來(lái),我們的命令? b[1]=1 和? b[2]=a 順利完成,最后我們用命令 echo $b?顯示 數(shù)組b的2個(gè)元素值:1 a。
可見,在zsh中,數(shù)組元素的下標(biāo)是從1開始的。
(2)在腳本文件中定義
$ echo 'b[0]=0' > b.sh
# csdn @ edu in ~ [22:07:01]?
$ echo 'b[1]=1' >> b.sh# csdn @ edu in ~ [22:07:24]?
$ echo 'b[2]=a' >> b.sh?# csdn @ edu in ~ [22:07:39]?
$ echo 'echo $b' >> b.sh?# csdn @ edu in ~ [22:08:05]?
$ cat b.sh ??
b[0]=0
b[1]=1
b[2]=a
echo $b# csdn @ edu in ~ [22:08:17]?
$ source ./b.sh
./b.sh:1: b: assignment to invalid subscript range# csdn @ edu in ~ [22:08:27] C:126
$ bash ./b.sh ?
0# csdn @ edu in ~ [22:08:53]?
$?
接著我們使用echo + 輸出重定向方式將數(shù)組定義語(yǔ)句
b[0]=0
b[1]=1
b[2]=a
?寫入腳本文件b.sh
然后 我們將 顯示數(shù)組元素 的命令 echo 'echo $b' >> b.sh?寫入腳本文件b.sh
隨后我們使用命令 cat b.sh ? ?查看腳本文件b.sh 的內(nèi)容:
b[0]=0
b[1]=1
b[2]=a
echo $b
接下來(lái)我們使用命令 source ./b.sh?來(lái)執(zhí)行腳本文件b.sh,但是命令在zsh下出錯(cuò)了:
./b.sh:1: b: assignment to invalid subscript range
這再次說(shuō)明,在zsh中,數(shù)組元素的下標(biāo)是從1開始的。
最后我們使用命令?bash ./b.sh? 來(lái)執(zhí)行腳本,命令順利完成。
可見,在bash 中,數(shù)組元素的下標(biāo)是從0開始的。
2.在sh中
(1)在命令行中定義?
csdn @edu in ~ exec sh
sh-4.2$ b[0]=0
sh-4.2$ b[1]=1
sh-4.2$ b[2]=a
sh-4.2$ echo $b
0
sh-4.2$?
數(shù)組成功創(chuàng)建,但只看到了數(shù)組中的第1個(gè)元素值。
(2)在腳本文件中定義
sh-4.2$ echo 'b[0]=0' > b.sh
sh-4.2$ echo 'b[1]=1' >> b.sh
sh-4.2$ echo 'b[2]=a' >> b.sh?
sh-4.2$ echo 'echo $b' >> b.sh
sh-4.2$ cat b.sh
b[0]=0
b[1]=1
echo $b
sh-4.2$ source ./b.sh
0
sh-4.2$?
我們先使用echo + 輸出重定向方式將數(shù)組定義語(yǔ)句
b[0]=0
b[1]=1
b[2]=a
?寫入腳本文件b.sh
然后 我們將 顯示數(shù)組元素 的命令 echo 'echo $b' >> b.sh?寫入腳本文件b.sh
隨后我們使用命令 cat b.sh ? ?查看腳本文件b.sh 的內(nèi)容:
b[0]=0
b[1]=1
b[2]=a
echo $b
最后我們使用???source ./b. sh?命令來(lái)執(zhí)行腳本文件b.sh,數(shù)組成功創(chuàng)建,但只看到了數(shù)組中的第1個(gè)元素值。
3.在bash中
(1)在命令行中定義
# csdn @ edu in ~ [23:53:42]?
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ b[0]=0
[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=a
[csdn ~]$ echo $b
0
[csdn ~]$?
命令全部順利執(zhí)行,可見在bash中,數(shù)組元素的下標(biāo)是從0開始的,但echo $b只顯示了數(shù)組第1個(gè)元素值。
(2)在腳本文件中定義
[csdn ~]$ echo b[0]=0 > b.sh
[csdn ~]$ echo b[1]=1 >> b.sh
[csdn ~]$ echo b[2]=a >> b.sh
[csdn ~]$ echo 'echo $b' >> b.sh
[csdn ~]$ cat b.sh
b[0]=0
b[1]=1
b[2]=a
echo $b
[csdn ~]$ . b.sh
0
[csdn ~]$?
在腳本文件中執(zhí)行跟?命令行執(zhí)行結(jié)果是一樣的。
(三)小結(jié)
在zsh中,數(shù)組元素的下標(biāo)是從 1 開始的,使用“$數(shù)組名”?可以獲得數(shù)組所有元素值。
在sh和bash中,數(shù)組元素的下標(biāo)是從 0 開始的,使用“$數(shù)組名”?只能獲得數(shù)組第1個(gè)元素值。
三、獲取所有的數(shù)組元素
通過(guò)上面的實(shí)例,我們發(fā)現(xiàn)在sh和bash中,使用“$數(shù)組名”?只能獲得數(shù)組第1個(gè)元素值,那么如何獲取所有的數(shù)組元素呢?我們可以使用*?或 @?作為下標(biāo)來(lái)獲取,具體格式即:
${數(shù)組名[@]}?
或
${數(shù)組名[*]}
(一)zsh中
# csdn @ edu in ~ [12:24:50]?
$ echo $0
/bin/zsh# csdn @ edu in ~ [12:25:24]?
$ a=(1 2 'a')# csdn @ edu in ~ [12:25:42]?
$ echo $a
1 2 a# csdn @ edu in ~ [12:27:06]?
$ echo ${a[@]}
1 2 a# csdn @ edu in ~ [12:27:39]?
$ echo ${a[*]}?
1 2 a# csdn @ edu in ~ [12:32:40]?
$?
(二)在sh中
# csdn @ edu in ~ [12:32:40]?
$ exec sh
sh-4.2$ a=(1 2 'a')
sh-4.2$ echo $a
1
sh-4.2$ echo ${a[@]}
1 2 a
sh-4.2$ echo ${a[*]}
1 2 a
sh-4.2$?
(三)在bash中
sh-4.2$ exec bash
[csdn ~]$ a=(1 2 'a')
[csdn ~]$ echo $a
1
[csdn ~]$ echo ${a[@]}
1 2 a
[csdn ~]$ echo ${a[*]}
1 2 a
[csdn ~]$?
四、獲取數(shù)組或數(shù)組元素的長(zhǎng)度
在介紹字符串時(shí),我們說(shuō)過(guò)獲取字符串的格式是:${#字符串名},獲取數(shù)組或數(shù)組元素長(zhǎng)度的格式是相似的:
${#數(shù)組名[下標(biāo)]}
或
${#數(shù)組名[下標(biāo)]}
如果要取數(shù)組的長(zhǎng)度,那么下標(biāo)就用*或 @。如果要取數(shù)組某個(gè)元素的長(zhǎng)度,那么下標(biāo)就用元素的下標(biāo)。
(一)在zsh中
# csdn @ edu in ~ [12:57:21]?
$ echo $0
/bin/zsh# csdn @ edu in ~ [12:57:24]?
$ b[1]=1?# csdn @ edu in ~ [12:57:31]?
$ b[2]=22?# csdn @ edu in ~ [12:57:36]?
$ echo ${b[*]}
1 22# csdn @ edu in ~ [12:57:49]?
$ echo ${#b[*]}
2# csdn @ edu in ~ [12:57:55]?
$ echo ${#b[@]}
2# csdn @ edu in ~ [12:57:59]?
$ echo ${b[0]}?
# csdn @ edu in ~ [12:58:07]?
$ echo ${#b[0]}
0# csdn @ edu in ~ [12:58:11]?
$ echo ${b[1]}?
1# csdn @ edu in ~ [12:58:26]?
$ echo ${#b[1]}
1# csdn @ edu in ~ [12:58:30]?
$ echo ${b[2]}?
22# csdn @ edu in ~ [12:58:35]?
$ echo ${#b[2]}
2
(二)sh中
# csdn @ edu in ~ [13:07:28]?
$ exec sh
sh-4.2$ b[1]=1
sh-4.2$ b[2]=22
sh-4.2$ echo ${b[*]}
1 22
sh-4.2$ echo ${#b[*]}
2
sh-4.2$ echo ${#b[@]}
2
sh-4.2$ echo ${b[0]}sh-4.2$ echo ${#b[0]}
0
sh-4.2$ echo ${b[1]}
1
sh-4.2$ echo ${#b[1]}
1
sh-4.2$ echo ${b[2]}
22
sh-4.2$ echo ${#b[2]}
2
sh-4.2$?
(三)bash中
[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=22
[csdn ~]$ echo ${b[@]}
1 22
[csdn ~]$ echo ${#b[@]}
2
[csdn ~]$ echo ${#b[*]}
2
[csdn ~]$ echo ${b[0]}[csdn ~]$ echo ${#b[0]}
0
[csdn ~]$ echo ${b[1]}
1
[csdn ~]$ echo ${#b[1]}
1
[csdn ~]$ echo ${b[2]}
22
[csdn ~]$ echo ${#b[2]}
2
[csdn ~]$?
在上面的實(shí)例中,由于zsh中數(shù)組元素下標(biāo)是從1開始的,所以我們定義數(shù)組b時(shí),是從下標(biāo)為1?的元素開始的。
然后我們先獲取整個(gè)數(shù)組的元素值和長(zhǎng)度,然后從下標(biāo)0開始獲取數(shù)組每個(gè)元素的值和長(zhǎng)度。
值得注意的是,我們使用命令?echo ${b[0]}?嘗試顯示數(shù)組b中下標(biāo)為0?的元素值?時(shí),系統(tǒng)沒(méi)有提示出錯(cuò);使用命令echo ${#b[0]}嘗試顯示數(shù)組b中下標(biāo)為0?的元素的長(zhǎng)度時(shí),系統(tǒng)反饋為0。