在本文中,將演示如何在bash shell指令碼中拆分字串。
在某些情況下,可能需要拆分字串資料以執行某些特定任務。大多數程式設計語言都包含內建功能「split」,可將任何字串資料分為多個部分。但是,bash不包含此類內建函式。但是可以使用定界符在bash指令碼中拆分任何字串資料。分隔符可以是單個字元,也可以是包含多個字元的字串。
檢視以下方法,了解如何在bash shell中分割字串:
以下是使用$IFS
在bash中拆分字串的步驟:
$IFS
是一個特殊的內部變數,用於將字串拆分為單詞。$IFS
變數稱為「內部欄位分隔符」,它確定Bash如何識別邊界。$IFS
用於分配分隔字串的特定定界符[IFS ='']
。空格是$IFS
的預設值。但是,也可以使用\t
,\n
,-
等值作為分隔符。-r
和-a
。即,read -ra ARR <<< "$str"
。在這裡,選項-r
用於定義反斜槓(\
),它是字元而不是跳脫字元。-a
選項用於定義將單詞(用$IFS
分隔)分配給從零開始的陣列順序索引。for
迴圈來存取令牌,這些令牌被拆分為一個陣列。下面通過一些範例來了解這種機制:
範例1:Bash按空格分割字串
在此範例中,使用空格字元定界符分割字串。
Bash指令碼檔案:split-demo1.sh
#!/bin/bash
#Example for bash split string by space
read -p "Enter any string separated by space: " str #reading string value
IFS=' ' #setting space as delimiter
read -ra ADDR <<<"$str" #reading str as an array as tokens separated by IFS
for i in "${ADDR[@]}"; #accessing each element of array
do
echo "$i"
done
如果輸入字串"welcome to yiibai!"
,則輸出如下所示:
範例2:Bash按符號分割字串
在某些情況下,可能需要用其他定界符(例如符號或特定字元)來分割字串。在本範例中,使用逗號(,
)符號字元作為分隔符來分割字串。
Bash指令碼程式碼:
#!/bin/bash
#Example for bash split string by Symbol (comma)
read -p "Enter Name, City and Age separated by a comma: " entry #reading string value
IFS=',' #setting comma as delimiter
read -a strarr <<<"$entry" #reading str as an array as tokens separated by IFS
echo "Name : ${strarr[0]} "
echo "City : ${strarr[1]} "
echo "Age : ${strarr[2]}"
執行上面範例程式碼,得到以下結果:
在bash中,也可以在不使用$IFS
變數的情況下分割字串。使用readarray
命令帶-d
選項來拆分字串資料。-d
選項適用於在命令中定義分隔符,例如$IFS
。此外,bash迴圈用於以拆分形式列印字串。
下面通過一些範例來了解此邏輯:
範例1:Bash按符號分割字串
本範例演示如何在不使用$IFS
的情況下拆分字串值。使用冒號(:
)輸入文字值,以便將其拆分。閱讀下面的bash指令碼程式碼:
#!/bin/bash
#Example for bash split string without $IFS
read -p "Enter any string separated by colon(:) " str #reading string value
readarray -d : -t strarr <<<"$str" #split a string based on the delimiter ':'
printf "\n"
#Print each value of Array with the help of loop
for (( n=0; n < ${#strarr[*]}; n++ ))
do
echo "${strarr[n]}"
done
執行上面範例程式碼,得到以下結果:
範例2:使用字串拆分字串
在此範例中,將使用慣用表示式 - 引數擴充套件。
Bash指令碼程式碼
#!/bin/bash
#Example for bash split string by another string
str="WeLearnWelcomeLearnYouLearnOnLearnYiibai"
delimiter=Learn
s=$str$delimiter
array=();
while [[ $s ]];
do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array
在此bash指令碼中,使用了以下引數擴充套件:
${s%%"$delimiter"*}
- 它刪除最長的匹配字尾模式。${s#*"$delimiter"}
- 它刪除最短的匹配字首模式。執行上面範例程式碼,得到以下結果:
maxsu@yiibai:~/bashcode$ vi split-bash.sh
maxsu@yiibai:~/bashcode$ chmod u+x split-bash.sh
maxsu@yiibai:~/bashcode$ ./split-bash.sh
declare -a array=([0]="We" [1]="Welcome" [2]="You" [3]="On" [4]="Yiibai")
範例3:使用Trim命令分割字串
在此範例中,我們使用trim(tr)命令分割字串。trim命令不是使用read命令,而是用於在定界符上拆分字串。
Bash指令碼程式碼
#!/bin/bash
#Example to split a string using trim (tr) command
my_str="We;welcome;you;on;yiibai!"
my_arr=($(echo $my_str | tr ";" "\n"))
for i in "${my_arr[@]}"
do
echo $i
done
執行上面範例程式碼,得到以下結果: