Bash
在 bash 腳本中拆分工作目錄
如果我做:
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
變數除外),您也應該取消設置checkIFS
andsaveIFS
。