之前工作上需要針對多顆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 指令實現字元替換 (!只能針對單個分隔符)
網路上的資料有這個部分,改天有用到,再來紀錄