不可不知的shell中的IFS

2021-10-07 15:06:43 字數 2496 閱讀 4927

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

doecho

"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環境中的預設定界符字串,預設值為空白字元(換行符、製表符、空格)。

不可不知道的Shell命令

為 專案名稱或專案路徑名 set m ps ef grep tomcat grep v grep awk sed e s kill 9 g sh cd web tomcat sh bin startup.sh tailf logs sys log.txt 檔名 方法1 lsb release a 方...

不可不知的健康知識

健康最重要 晚上9 11點為免疫系統 淋巴 排毒時間,此段時間應安靜或聽 晚間11 凌晨1點,肝的排毒,需在熟睡中進行。凌晨1 3點,膽的排毒,亦同。凌晨3 5點,肺的排毒。此即為何咳嗽的人在這段時間咳得最劇烈,因排毒動作已走到肺 不應用止咳藥,以免抑制廢積物的排除。凌晨5 7點,大腸的排毒,應上廁...

不可不知的sudo命令

在linux運維工作中,每個人都應該各司其職。比如說運維經理掌握了root使用者,普通的運維人員一般人手乙個普通登入使用者。root使用者不簡單啊,建立使用者,日常重啟伺服器工作,以及一些其他的日常工作都是root使用者來完成的!很厲害吧!雖然運維經理是乙個super man,但是人家畢竟是經理嘛!...