Shell數據-字符串和數組


一.字符串

字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似:

單雙引號的區別:

  • 雙引號里可以有變量,單引號則原樣輸出
  • 雙引號里可以出現轉義字符,單引號則原樣輸出
  • 單引號字串中不能出現單引號。

拼接字符串

#!/bin/bash

str1='i'
str2='love'
str3='you'

echo $str1 $str2 $str3
echo $str1$str2$str3
echo $str1,$str2,$str3

 

輸出:

i love you
iloveyou
i,love,you

獲取字符串長度 ${#str}

#!/bin/bash/

str='i love you'

echo ${#str}

# 輸出:10

截取字符串

#! /bin/bash

str='i love you'

echo ${str:1} #從第一個截取末尾,注意從0,開始
echo ${str:2:2}  #從第二個開始截取2個
echo ${str:0} #從0開始,也就是全部截取
echo ${str:-3} #負數無效,是為0

輸出:

love you
lo
i love you
i love you

查找字符串

#!/bin/bash/

str="i love you"

echo `expr index "$str" l`
echo `expr index "$str" you` #最后一個參數是字符,會對后面字符串每一個單獨查找,返回最靠前的index
echo `expr index "$str" o`
echo `expr length "$str"` #字符串長度
echo `expr substr "$str" 1 6` #從字符串中位置1開始截取6個字符。索引是從0開始的。

輸出:

3
4
4
10
i love

注意字符串變量需要加雙引號。第2個例子里you雖然y的index是8,但是o在前面已經出現過,index是4,最終取所有字符里最靠前的index。

*拓展:expr更多關於字符串用法:

STRING : REGEXP   anchored pattern match of REGEXP in STRING match STRING REGEXP same as STRING : REGEXP substr STRING POS LENGTH #從STRING中POS位置開始截取LENGTH個字符。POS索引是從1開始的。 index STRING CHARS #在STRING中查找字符CHARS首次出現的位置,沒有找到返回0 length STRING #字符串長度

二.數組

bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。類似與C語言,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於0。

在Shell中,用括號來表示數組,數組元素用空格符號分割開。定義數組的一般形式為:

array_name=(value1 value2 ... valuen)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
    value0
    value1
    value2
    value3
)

還可以單獨定義數組的各個分量:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

可以不使用連續的下標,而且下標的范圍沒有限制。

下面來讀取數組:

echo ${array_name[2]} #讀取下標為2的元素
echo ${array_name[*]} #讀取所有元素
echo ${array_name[@]} #讀取所有元素


echo ${#array_name[*]} #獲取數組長度
echo ${#array_name[@]} #獲取數組長度
echo ${#array_name[1]} #獲取數組中單個元素的長度

輸出:

value2
value0 value1 value2 value3
value0 value1 value2 value3
4
4
6

  # 數組截取

  # 可以獲取子數組,下面示例為獲取數組的第 1、2 下標位置的元素

echo ${mArray[@]: 1:2}

  # 可以獲取數組中某個元素的若干字符,下面示例為獲取數組中第二個元素的 從0開始 3個字符

echo ${mArray[1]: 0:3}

  # 合並數組

Front=("javascript" "typescript")   # 數組聲明也可以忽略 declear -a
Conn=(${mArray[@]} ${Front[@]})
echo ${Conn[@]}
echo ${#Conn[@]}            # 合並得到數組的長度

  #替換元素

mArray=(${mArray[@] /123/"java"})
echo ${mArray[@]}

  #取消數組或元素

unset mArray[1]
echo "取消下標為 1 的元素后,數組為:${mArray[@]},數組長度為 ${#mArray[@]}"
# 需要注意的是,數組的 1 位置的元素變為了空,而不是后面的元素向前移動
echo "數組 1 位置的元素為 ${mArray[1]}, 2 位置的元素為 ${mArray[2]}"

總結

對比shell里字符串和數組,我們發現:

字符串

str="hello"
${#str} # 讀取字符串長度
echo ${str} # 讀取字符串全部
echo ${str:1} # 截取字符串

數組:

arr=(a1 a2 a3)
echo ${#arr[*]} # 讀取數組長度
echo ${#arr[1]} # 讀取數組某個元素長度

echo ${arr[*]} # 讀取數組全部
echo ${arr[1]} # 讀取數組某個元素

 

${#ele*}用來讀取ele元素長度屬性 ${ele*}用來讀取或操作ele元素

 

# 取消數組或元素

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM