關于將字串拆分為陣列,我們有兩種情況:
如果字串有空格如何分隔符,根據以下帖子:
- 將空格分隔的字串讀入 Bash 中的陣列
所以如果我使用:
string="Hello Unix World"
array1=($string)
echo ${array1[@]}
echo "size: '${#array1[@]}'"
read -a array2 <<< $string
echo ${array2[@]}
echo "size: '${#array2[@]}'"
輸出是:
Hello Unix World
size: '3'
Hello Unix World
size: '3'
兩種方法都按預期作業。
現在,如果字串有一些不同于空格的東西,那么分隔符如何,根據以下帖子:
- 如何在 Bash 中將字串拆分為陣列?
所以如果我使用:
path="/home/human/scripts"
IFS='/' read -r -a array <<< "$path"
echo "Approach 1"
echo ${array[@]}
echo "size: '${#array[@]}'"
echo "Approach 2"
for i in "${array[@]}"; do
echo "$i"
done
echo "Approach 3"
for (( i=0; i < ${#array[@]}; i )); do
echo "$i: ${array[$i]}"
done
它列印:
Approach 1
home human scripts <--- apparently all is ok, but see the line just below!
size: '4'
Approach 2
<--- an empty element
home
human
scripts
Approach 3
0: <--- confirmed, the empty element
1: home
2: human
3: scripts
為什么會出現那個空元素?如何修復命令以避免這種情況?
uj5u.com熱心網友回復:
您的字串分為 4 個部分:一個空的部分和三個單詞。
path="/home/human/scripts"
IFS='/' read -r -a array <<< "$path"
declare -p array
輸出:
declare -a array=([0]="" [1]="home" [2]="human" [3]="scripts")
有很多方法可以修復它。一種是洗掉空值。另一種是在拆分之前排除開始的斜線。
for i in "${!array[@]}"; do
[[ ${array[i]} ]] || unset 'array[i]'
done
或者
IFS='/' read -r -a array <<< "${path#/}"
第一個適用于路徑形式,不僅在開始時重復斜線。
uj5u.com熱心網友回復:
只是為了堆砌真正的格式化評論:
該手冊(在3.5.7 Word Splitting 中)將 IFS 描述為“欄位終止符”:
shell 將每個字符
$IFS視為分隔符,并將其他擴展的結果拆分為使用這些字符作為欄位終止符的單詞。
對于IFS=/ read -a fields <<< "/home/user",第一個欄位是由第一個斜杠終止的空字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405831.html
標籤:
下一篇:添加重定向到bash命令陣列
