數組賦值:a=(1 2 3 4 5)
a[1]=1
數組長度:echo ${#a[@]}
或者 echo ${#a[*]}
讀取數組:echo ${a[@]}
或者 echo ${a[*]}
echo ${a[0]} PS: 數組下標從0開始
刪除數組:unset a
unset a[1]
數組分區:echo ${a[@]:0:3} 顯示為1,2,3 ps:截取前3個數組值顯示
數組替換:echo ${a[@]/3/100} 顯示為1,2,100,4,5
數組迴圈取值用法:
for FILE in ${a[@]};do
echo ${FILE};
done
顯示數值:
#!/bin/bash
chars=’abcdefghijklmnopqrstuvwxyz’
for (( i=0; i<26; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
例子補充
1。將字串放在數組中,擷取其長度
#!/bin/bash
str="a b --n d"
array=($str)
length=${#array[@]}
echo $length
for ((i=0; i<$length; i++))
do
echo ${array[$i]}
done
執行結果:
[oracle@99bill-as9 array]$ sh length.sh
4
a
b
--n
d
列印字串:
#!/bin/bash
str="a b c"
for i in $str
do
echo $i
done
或者:
#!/bin/bash
str="a b c"
array=($str)
for ((i=0;i<${#array[@]};i++))
do
echo ${array[$i]}
done
執行結果:
a
b
c
2。字串用其他字元分割時
#!/bin/bash
str2="a#b#c"
a=($(echo $str2 | tr '#' ' ' | tr -s ' '))
length=${#a[@]}
for ((i=0; i<$length; i++))
do
echo ${a[$i]}
done
#echo ${a[2]}
執行結果:
a
b
c
3。數組的其他動作
#!/bin/bash
str="a b --n dd"
array=($str)
length=${#array[@]}
#ouput the first array element直接輸出的是數組的第一個元素
echo $array
#Use subscript way access array用下標的方式訪問數組元素
echo ${array[1]}
#Output the array輸出這個數組
echo ${array[@]}
#Output in the array subscript for 3 the length of the element輸出數組中下標為3的元素的長度
echo ${#array[3]}
#Output in the array subscript 1 to 3 element輸出數組中下標為1到3的元素
echo ${array[@]:1:3}
#Output in the array subscript greater than 2 elements輸出數組中下標大於2的元素
echo ${array[@]:2}
#Output in the array subscript less than 2 elements輸出數組中下標小於2的元素
echo ${array[@]::2}
執行結果:
a
b
a b --n dd
2
b --n dd
--n dd
a b
4。遍曆訪問一個字串(預設是以空格分開的,當字串是以其他分隔字元分開時可以參考2)
#!/bin/bash
str="a --m"
for i in $str
do
echo $i
done
執行結果:
a
--m
5。如何使用echo輸出一個字串str="-n". 由於-n是echo的一個參數,所以一般的方法echo "$str"是無法輸出的.
解決方案可以有:
echo x$str | sed 's/^x//'
echo -ne "$str\n"
echo -e "$str\n\c"
printf "%s\n" $str(這樣也可以)
1、從“標準輸入”讀入n次字串,每次輸入的字串儲存在數組array裡
#!/bin/bash
i=0
n=5
while [ "$i" -lt $n ] ; do
echo "Please input strings ... `expr $i + 1`"
read array[$i]
b=${array[$i]}
echo "$b"
i=`expr $i + 1`
done
2、將字串裡的字母逐個放入數組,並輸出到“標準輸出”
#!/bin/bash
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<26; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
這裡有趣的地方是 ${chars:$i:1},表示從chars字串的 $i 位置開始,擷取 1 個字元。如果將 1 改為 3 ,就擷取 3 個字元啦~ 結果是:
abc
bcd
...
vxy
xyz
yz //沒有足夠字串擷取了
z //沒有足夠字串擷取了
下面介紹將數組應用到shell環境變數的一些例子。
3、將數組應用到shell環境變數(1)
數組賦值:
[root@pps ~]# SEASON=("Srping" "Summer" "Autumn" "Winter")
當你發現賦值錯了,也可以立刻從新賦值糾正,如上面的 Spring 被寫成 Srping。
重新賦值:(原來的值被重寫)
[root@pps ~]# SEASON=("Spring" "Summer" "Autumn" "Winter")
查看一下環境變數:
[root@pps ~]# set | grep SEASON
SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
顯示整個數組:
[root@pps ~]# echo ${SEASON[*]} 或者 echo ${SEASON[@]}
Spring Summer Autumn Winter
顯示某一數組元素:
[root@pps ~]# echo ${SEASON[3]}
Winter
給單個數組元素賦值:
[root@pps ~]# SEASON[0]="New_Spring"
再查看一下看數組:
[root@pps ~]# echo ${SEASON[*]}
New_Spring Summer Autumn Winter
清除指定的單個數組元素:
[root@pps ~]# unset SEASON[2]
清除整個數組:
[root@pps ~]# unset SEASON
4、將數組應用到shell環境變數(2)
使用tr命令將檔案中的斷行符號轉換成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file
將檔案中內容給數組賦值:(碰到第一個斷行符號符之前的內容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file
查看數組賦值情況:
[root@pps ~]# set | grep "SHELLS"
SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")
後面可以將這個數組環境變數應用到其它的SHELL指令碼或者應用程式裡了
數組的提取
從尾部開始提取:
array=( [0]=one [1]=two [2]=three [3]=four )
${array[@]:1} # two three four,除掉第一個元素後所有元素,那麼${array[@]:0}表示所有元素
${array[@]:0:2} # one two
${array[@]:1:2} # two three
子串刪除
[root@localhost dev]# echo ${array[@]:0}
one two three four
[root@localhost dev]# echo ${array[@]#t*e} # 左邊開始最短的匹配:"t*e",這將匹配到"thre"
one two e four
[root@localhost dev]# echo ${array[@]##t*e} # 左邊開始最長的匹配,這將匹配到"three"
[root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
[root@localhost dev]# echo ${array[@] %o} # 從字串的結尾開始最短的匹配
one tw three four
[root@localhost dev]# echo ${array[@] %%o} # 從字串的結尾開始最長的匹配
one tw three four
子串替換
[root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
第一個匹配到的,會被刪除
[root@localhost dev]# echo ${array[@] /o/m}
mne twm three fmur
所有匹配到的,都會被刪除
[root@localhost dev]# echo ${array[@] //o/m}
mne twm three fmur
沒有指定替換子串,則刪除匹配到的子符
[root@localhost dev]# echo ${array[@] //o/}
ne tw three fur
替換字串前端子串
[root@localhost dev]# echo ${array[@] /#o/k}
kne two three four
替換字串後端子串
[root@localhost dev]# echo ${array[@] /%o/k}
one twk three four
好了到這裡關於shell命令的數組操作就總結到了這裡,希望能協助各位。