close

之前工作上需要針對多顆HDD去跑格式化、分割Partition、格式化…等等
寫Shell Script用上了Array

最早是用利用

一、shell中字串替換的方式,將變數內容變成陣列的形式:

#!/bin/bash
str="/dev/sda,/dev/sdb,/dev/sdc,/dev/sdc"
array=(${str//,/ })          #這裡將','轉換成' '並且會自動存成array

或是
str="/dev/sda /dev/sdb /dev/sdc /dev/sdc"
array=(${str// / })          #這裡將' '轉換成' '並且會自動存成array

for i in "${!array[@]}"; do
    echo "$i:${array[i]}"
done

 

但是,當我的資料內容,中間有空格的時候(ex: str="BMC Temp,PDB Inlet,CPU0 FSC Margin,DIMM E1 CPU0"),上述這個方法就會出錯了

那時候去找了別的資料,發現是因為IFS符號沒改到,所以關鍵是IFS的符號

二、使用內建的分割符IFS:

str="BMC Temp,PDB Inlet,CPU0 FSC Margin,DIMM E1 CPU0"
IFS='-'                # hyphen (-) is set as delimiter
array=(${str// / })    #這裡將' '轉換成' '並且會自動存成array
IFS=' '                # reset to default value after usage

或是
IFS='-'                # hyphen (-) is set as delimiter
read -ra ArrayFromStr<<< "$str"   # str is read into an array as tokens separated by IFS
IFS=' '                # reset to default value after usage

##################################

for迴圈,若形式是下方的方式,也會用到IFS
for number in $SensorTemps
do
    echo "------"
    echo "Sensor in Array:    $number"
done

for number in ${SensorTemps[@]}
do
    echo "------"
    echo "Sensor in Array:    $number"
done

##################################

由於不少command會用到 IFS,實際遇到連 for-loop with in $String也會用到
建議,修改IFS之前,將原始的IFS存下來,修改使用之後再復原
-----------------------------------------
安全的方法
str="BMC Temp,PDB Inlet,CPU0 FSC Margin,DIMM E1 CPU0"
SensorTemps ="BMC Temp,PDB Inlet,CPU0 FSC Margin,DIMM E1 CPU0"

old_IFS="$IFS"        #儲存IFS分隔符號
IFS=","               #修改IFS分隔符號成,
array=(${str//,/,})   #變數轉成ARRAY (方式一)
read -ra SensorTemps <<< "$SensorTemps" #變數轉成ARRAY (方式二)
IFS="$old_IFS"        #復原IFS分隔符號

 

三、利用tr 指令實現字元替換  (!只能針對單個分隔符)

網路上的資料有這個部分,改天有用到,再來紀錄

arrow
arrow
    全站熱搜

    吾給力 發表在 痞客邦 留言(0) 人氣()