不可不知的shell中的IFS

Linux下有一個特殊的環境變量叫做IFS,叫做內部字段分隔符(internal field separator)。它可以決定項目列表或值的列表的分隔符,IFS的默認值爲空格,Tab製表符或換行符。使用for循環讀取項目的列表或直列表時,就會根據IFS的值判斷列表中的個數,最終決定循環的次數。

默認情況下,bash shell會將下面的字符當做字段分隔符:空格、製表符、換行符。

ASCLL碼錶

在這裏插入圖片描述

在這裏插入圖片描述

IPFS的值是空格或Tab製表符

當我們在終端上使用echo命令輸出IFS的值時,因爲IFS的值是空格或Tab製表符,所以無法顯示具體的內容。

在這裏插入圖片描述

還有就是IFS的值還可以是一個換行符,上面輸出結果就可以看出,是一個空白行。echo命令在輸出數據內容後又會自動進行一次換行,所以最後輸出兩個空白行。

printf 命令輸出IFS值

下面使用printf命令輸出IFS值:
在這裏插入圖片描述

從上面的輸出信息來看,輸出IFS值,只有一個空白行,不會輸出有兩個空白行的情況發生,因爲printf打印完內容後默認不換行。

使用od命令查看

在上面的輸出結果來看。不管是使用echo還是printf命令,在輸出的結果中都無法顯式地查看到具體的內容。但是我們可以通過od命令將數據轉換爲八進制或者十六進制後再查看:

語法:

od(選項)(參數)

常用選項:

-a:此參數的效果和同時指定“-ta”參數相同;
-b:此參數的效果和同時指定“-toC”參數相同;
-c:此參數的效果和同時指定“-tC”參數相同;
-d:此參數的效果和同時指定“-tu2”參數相同;
-f:此參數的效果和同時指定“-tfF”參數相同;
-h:此參數的效果和同時指定“-tx2”參數相同;
-i:此參數的效果和同時指定“-td2”參數相同;
-j<字符數目>或–skip-bytes=<字符數目>:略過設置的字符數目;
-o:此參數的效果和同時指定“-to2”參數相同;
-s<字符串字符數>或–strings=<字符串字符數>:只顯示符合指定的字符數目的字符串;
-t<輸出格式>或–format=<輸出格式>:設置輸出格式;
-w<每列字符數>或–width=<每列字符數>:設置每列的最大字符數;

在這裏插入圖片描述
從上面的輸出結果來看,八進制040是空格,011是Tab製表符,012是換行符。因爲IFS的原始值不容易設置,所以當需要修改IFS值時,最好提前備份原始值。

IFS修改

Bash shell會將上面的三個字符當做列表中新字段的開始。例如,zhangsan lisi wangwu字符串在shell中會當做三個字段zhangsan ;lisi ;wangwu。如果想要以逗號分隔字段,則要修改IFS的值,修改如下:

IFS=';'

定義分隔符爲分號,變量X的值也使用分號分隔,循環遍歷,每次循環輸出一個名字。

#!/bin/bash

IFS=";"

X="zhangsan;lisi;wangwu"
for i in $X
do
        echo "I am $i."
done
echo

輸出:
在這裏插入圖片描述

通常我們需要設置IFS爲分號、句號、或者冒號,之類的分隔符時,可以通過變量賦值的方式直接設置。例如IFS=";",但是不要直接通過IFS="\t"或者"\r"、“\a"將分隔符設置爲製表符,不然系統會使用字母t作爲分隔符。

那麼應該如何地正確使用特殊字符設置爲系統默認的分隔符呢?

在這裏插入圖片描述

注意,輸出的時候a、b、c之間使用Tab製表符分隔。如果輸入的值之間沒有使用Tab製表符分隔,而是使用t分隔,則系統會認爲"atbtct"是一個整體的字符串。並將字符串賦給變量a,最後使用echo命令回顯b和c時則爲空。

總結

IFS是存儲定界符的環境變量,是shell環境中的默認定界符字符串,默認值爲空白字符(換行符、製表符、空格)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章