IFS簡單說明

2021-09-07 14:21:35 字數 1591 閱讀 5317

bash&shell系列文章:

bash下的很多命令都會分割單詞,絕大多數時候預設是採用空格作為分隔符,有些時候遇到製表符、換行符也會進行分隔。最典型的是"for i in a b c",它會分割變數列表"a b c"使其成為三個變數。這種分隔符是由ifs變數指定的。

ifs是bash內部字段分隔符的環境變數。

[root@xuexi ~]# set | grep

ifsifs=$'

\t\n

'

預設的ifs在碰到空格、製表符\t和分行符\n就會自動分隔進入下一步。但是對空格處理有點不一樣,對行首和行尾兩邊的空格不處理,並且多個連續的空格預設當作乙個空格。

有些時候在編寫指令碼或執行迴圈的時候,修改ifs可以起很大作用。如果要修改ifs,最好記得先備份系統ifs,再需要的地方再還原ifs。

例如:

[root@xuexi ~]# data="

name,***,rollno,location

"[root@xuexi ~]# oldifs=$ifs # 備份ifs到變數oldifs

[root@xuexi ~]# ifs=$','# 將ifs設定為逗號,便於做data的分隔符

[root@xuexi ~]# for item in $data;do

echo item:$item;done

item:name

item:***

item:rollno

item:location

[root@xuexi ~]# ifs=$oldifs  # 最後將ifs還原

可以看到,上面的示例將預設分隔符設定為了逗號後,不用處理data變數就可以輕鬆劃分欄位了。

大多數時候,我們都不會去修改ifs也不會想到通過修改ifs來達到某種目的,而是採用其他方法來替代實現。這樣就需要注意預設ifs(" \t\n")的乙個特殊性,它會忽略前導空白和字尾空白,並壓縮連續空白。在某些時候,這會出現意想不到的問題。

例如:

[root@xuexi ~]# a=-s"

"[root@xuexi ~]# echo"$a

" | wc -m

4

實際上這裡的$a是3個字元組成的,最後乙個字元為空格。如果不對變數加引號,那麼很多情況下都會出現問題:

[root@xuexi ~]# echo $a | wc -m           # s後面的空格被忽略了

3[root@xuexi ~]# echo"$

" | wc -m # 擷取到了s後面的空格

2[root@xuexi ~]# echo $ | wc -m # 沒有擷取到s後面的空格

1[root@xuexi ~]# expr substr $a 3

100 | wc -m # 沒有擷取到s後面的空格

1[root@xuexi ~]# expr substr "$a"

3100 | wc -m # 擷取到了s後面的空格

2

因此,在可以對變數加引號的情況下,盡100個可能地加上引號來保護空白字元。

FormatMessage簡單說明

常用引數簡介.formatmessage format message from system format message allocate buffer,null,lval,null,lptstr hlocal,0,null 第乙個引數是標誌,告訴這個formatmessage函式,我想要的特點...

Subversion 簡單說明

subversion 簡單說明 checkout 從源 管理伺服器取出 commit 提交更新的 到源 管理伺服器。update 從源 管理伺服器獲取 的最新更新。export 從源 管理伺服器匯出 匯出的 將脫離源 管理。revert 將當前資料恢復到最近與伺服器同步的版本,即放棄自己的所有未提交...

std deque簡單說明

本文 http blog.chinaunix.net u2 86575 showart 1734758.html std deque是乙個高效的雙端佇列,可以高效地進行插入和刪除操作。以sgi c stl為例 deque的基本結構是 有乙個map map中的元素是乙個記錄了乙個大小為512位元組的線...