Shell

算術擴展是否以某種方式與 IFS 相關?

  • July 25, 2018

來自https://unix.stackexchange.com/a/458074/674

算術擴展也受到 split+glob 所以也應該被引用 (shift " $ ((OPTIND - 1))") (here not a problem though as you’re using bash which doesn’t inherit $ 來自環境的 IFS 並且您沒有在腳本的早期修改 IFS,但仍然是很好的做法)。

算術擴展是否以某種方式與 IFS 相關?

不帶引號的算術擴展的結果會經歷文件名萬用字元(萬用字元擴展)和單詞(欄位)拆分,就像任何其他不帶引號的擴展一樣。它非常沒用,一些 shell 不這樣做,但它是歷史 shell 所做的(因為它更容易實現),所以它是 POSIX 標準化的。

算術擴展的結果只是一串-數字,所以它永遠不能包含萬用字元。(少數 shell 具有浮點,還可以包含.,+和字母。)由於它不能包含空格,因此通常也不受欄位拆分的影響。但是,欄位拆分可通過以下方式配置IFS:欄位分隔符是 的字元IFS。包含數字IFS是極其罕見的,而且是一件非常愚蠢的事情,但如果你想編寫完全健壯的程式碼,你需要防止這種情況發生。如果結果可能是否定的,這更重要,因為包含一個破折號IFS並不是那麼愚蠢。

POSIX 聲明 shellIFS在啟動時必須設置為其預設值,以便腳本不受IFS環境中可能存在的值的影響。(不常見 export IFS,但有人可以這樣做。)但是,一些廣泛使用的 shell(dash、Busybox sh)IFS在環境中保留了 is 的任何值,因此強大的 shell 腳本應該明確IFS設置為其預設值(或取消設置它,如果它包含任何未引用的擴展,則具有相同的效果。

引用自:https://unix.stackexchange.com/questions/458264