Linux Bash 指令碼中 IFS 的含義


簡介

在 Linux 上的 Bash 指令碼中,“IFS”(內部欄位分隔符)變數在控制字串中欄位的分隔方式方面起著重要作用。IFS 預設設定為空格、製表符和換行符,這意味著預設情況下,字串中的欄位由這些字元的任意組合分隔。但是,可以更改 IFS 值以滿足指令碼的特定需求。在本文中,我們將探討Bash 中 IFS 的含義以及如何在各種場景中使用它。

Linux

IFS 是 Bash 中的一個特殊變數,用於控制連字元和行解析的欄位分隔符。預設情況下,IFS 設定為空格、製表符和換行符,這意味著字串中的欄位由這些字元的任意組合分隔。例如,如果將字串“hello world”傳遞給指令碼,則字串中的兩個欄位將是“hello”和“world”,由空格分隔。

IFS 可以更改為任何字串,從而在解析字串中的欄位時提供更大的靈活性。例如,如果將 IFS 設定為“,” ,則字串中的欄位將由逗號分隔。這在處理逗號分隔值 (CSV) 檔案時很有用,其中檔案中的每一行都表示一條記錄,欄位由逗號分隔。

更改 IFS

可以透過為變數賦值來更改IFS。例如,要將 IFS 更改為逗號,請使用以下命令:

$ IFS=","

需要注意的是,更改 IFS 值只會影響當前的 Shell 會話。如果希望更改在會話之間持續存在,則需要在“.bashrc”“.bash_profile”檔案中設定 IFS 值。

在單詞分割中使用 IFS

IFS 可用於連字元,以控制字串中欄位的分隔方式。內建命令 read 可以與 IFS 結合使用,以從字串中讀取欄位並將它們分配給變數。例如,以下命令可用於從 CSV 檔案中讀取欄位並將它們分配給變數:

IFS=","
while read -r field1 field2 field3; do
   echo "Field 1: $field1"
   echo "Field 2: $field2"
   echo "Field 3: $field3"
done < input.csv

在此示例中,while 迴圈讀取“input.csv”檔案的每一行,並將欄位分別分配給變數 field1、field2 和 field3。“-r”選項用於防止反斜槓被視為跳脫字元。

在行解析中使用 IFS

IFS 也可以用於行解析,以控制字串中欄位的分隔方式。cut 命令可以與 IFS 結合使用,以從字串中提取特定的欄位。例如,以下命令可用於提取字串的第一個和第三個欄位:

IFS=":"
string="field1:field2:field3"
fields=$(cut -f1,3 -d "$IFS" <<< "$string")
echo $fields
# Output : field1 field3

在此示例中,cut 命令用於提取字串的第一個和第三個欄位,使用 IFS 值作為欄位分隔符。“-f”選項用於指定要提取的欄位,“-d”選項用於指定要使用的分隔符。此命令的輸出將是“field1 field3”,欄位由空格分隔,因為 IFS 配置為冒號。

在陣列操作中使用 IFS

IFS 也可以用於陣列操作,以控制字串中欄位的分隔方式。IFS 變數可用於使用 read 命令將字串拆分為陣列。例如,以下命令可用於將字串拆分為陣列:

IFS=":"
string="field1:field2:field3"
read -a array <<< $string
for element in "${array[@]}"
do
   echo $element
done
# Output : 
# field1
# field2
# field3

在此示例中,read 命令用於使用IFS值作為欄位分隔符將字串拆分為陣列。“-a”選項用於指定輸入應被視為陣列。for 迴圈用於迭代陣列的元素並列印它們。

結論

在 Bash 指令碼中,“IFS”變數在控制字串中欄位的分隔方式方面起著重要作用。預設情況下,IFS 設定為空格、製表符和換行符,這意味著字串中的欄位由這些字元的任意組合分隔。但是,可以修改IFS值以滿足指令碼的特定需求。透過更改 IFS 的值,它可以用於單詞分割、行解析和陣列操作。這在解析字串中的欄位方面提供了高度的靈活性,使其成為任何Bash指令碼的必不可少的工具。

更新於: 2023年1月20日

12K+ 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告