更新:該OP自澄清,使用mkdir
只是一個例子,而他需要一個通用機制,有條件地從一個文本文件,其中包含shell命令,根據命令是否指的是現有目錄或不執行行:
while read -r cmd dir; do [[ -d $dir ]] || eval "$cmd $path"; done < /path/to/my/file.txt
- 的
while
循環讀取包含文本文件shell命令一行一行。
read -r cmd dir
將每一行解析爲第一個標記 - 假定爲命令(示例輸入中的mkdir
) - 其餘的,假定爲目錄路徑。
[[ -d $dir ]]
測試目錄路徑的存在,並且只有||
如果測試失敗,即執行其RHS,如果該目錄不存在。
eval "$cmd $path"
然後執行該行;注意在這裏使用eval
的安全性不如管道到sh
安全 - 在這兩種情況下,您都必須信任代表命令的字符串。 (從當前的Bash shell使用eval
意味着Bash將執行該命令,而不是sh
,但我認爲這不是問題。)
原來的答覆,基於該mkdir
實際使用的假設:
你的情況,最簡單的方法是將-p
選項添加到您的mkdir
調用,這會悄悄地忽略嘗試創建一個已經存在的目錄:
mkdir -p /path/to/a/directory
mkdir -p /path/to/another/directory
mkdir -p /path/to/yet/another/directory
換句話說:mkdir -p
確保存在目標目錄,不管該目錄是否存在。已經存在或必須創建。 (mkdir -p
仍然可能失敗,例如當目標路徑是文件,而不是一個目錄,或者如果你沒有足夠的權限來創建目錄。)
然後,您可以簡單地將文件傳遞給sh
(無需cat
和管道,這是低效率):
sh /path/to/my/file.txt
如果你不控制輸入文件的創建,您可以使用sed
插入-p
選項:
sed 's/^mkdir /&-p /' /path/to/my/file.txt | sh
無法將命令輸入到「if」中。你的項目聽起來過於雄心勃勃。獲得更簡單的版本,並確定它是否真的值得重建shell腳本範例;-)。對於dir存在的傳統測試是'if! [[-d「$ dir」]];那麼mkdir -p「$ dir」; fi'。祝你好運。 – shellter
問題不是你不能通過管道傳遞一個'if'語句(你可以),這就是你真的需要一個循環。 – chepner
@chepner:你*可以*管道到'if'語句!?酷,你可以在這裏作爲評論給出一個1/2內膽的例子嗎?謝謝 – shellter