Bash

在 bash 腳本中拆分工作目錄

  • March 11, 2018

如果我做:

IFS="/" read -ra PARTS

並手動輸入路徑,它會按照希望創建數組“PARTS”,但是:

IFS="/" read -ra PARTS <<< $(pwd)

創建一個包含單個元素的數組,斜杠轉換為空格

如何將目前工作目錄拆分為數組?

如果您引用該命令,它將起作用。

IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
 printf '%s\n' "$i"
done

home
user1

既然問題是

如何將目前工作目錄拆分為數組?

(而不是“我怎麼 去上班?”),我給你IFS="*something*" read -a *arrayname* <<< $(*command*)

saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); IFS="$saveIFS"

是的,我知道; 它很醜。我試過

IFS=/ PARTS=($(pwd))

即使我將整個命令包含在……或使用中,它仍然IFS設置為. 自然,將其封閉在…中導致 未設置在主外殼中。/``{``;}``eval``(``)``PARTS

IFS=/ declare PARTS=($(pwd))

失敗得更慘。

第一個程式碼塊(帶有saveIFS)保存 IFS 的舊值並恢復它(更改後)。但是,如果之前未設置 IFS,則上述程式碼會將其設置為空字元串(通常稱為空字元串)。如果您的環境中可能出現這種情況,並且您希望能夠將 IFS 恢復為未設置,則可以執行以下操作:

checkIFS="${IFS+1}"
saveIFS="$IFS"
IFS=/ PARTS=($(pwd))
if [ "$checkIFS" ]
then
   IFS="$saveIFS"
else
   unset IFS
fi

(或者,全部在一行中)

checkIFS="${IFS+1}"; saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); if [ "$checkIFS" ]; then IFS="$saveIFS"; else unset IFS; fi

此處,checkIFS如果未設置 IFS,則設置為 1,如果設置了 IFS,則設置為null。然後它會進行明顯的測試以將 IFS 恢復到其先前的(設置)/(未設置)狀態,如果存在則恢復其先前的值。

當然,如果您非常關心保持環境不變(PARTS變數除外),您也應該取消設置checkIFSand saveIFS

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