通過組合標誌測試多個文件條件——它有效嗎?
我在 StackOverflow 上的回答至少獲得了兩次贊成票,它在我以前工作場所使用的工作站的外殼上起作用。在那個可能是 SunOS 或 Red Hat Commercial Linux 或 Red Hat Enterprise Linux 的舊版本的工作站上,測試正常文件和可寫目錄的存在。, , ,並且是該工作站上唯一可能安裝的 shell,我很可能在.
[[ -fwd
path
]]
path
sh``bash``csh``tcsh``zsh``bash
我問這個問題是因為我現在無法在其他類 Unix 作業系統上重現它。它總是給我一個語法錯誤,所以我開始懷疑我是否成功地執行過它。
我的問題是:此程式碼在哪些系統上有效,如果是,這是錯誤還是功能?
不,那行不通。在任何版本的 bash 中都不是。
該測試適用於任何 bash 版本(實際上,適用於任何 shell):
$ [ -fwd ] && echo "It worked" || echo "not" It worked
但它測試的不是文件標誌,而是測試字元串
-fwd
的長度是否為0。因為它有一些字元,所以測試是真的。使用
[[
更改允許的標誌:$ [[ -fwd ]] && echo "It worked" || echo "not" b204sh : /home/user/so: line 3: unexpected argument to conditional unary operator
在 bash 3.2 中給出上述錯誤。
3.2之後的bash版本沒有報錯,但結果是真實的:
$ [[ -fwd ]] && echo "It worked" || echo "not" It worked
這是不可能的:一個目錄條目不能既是文件 (
-f
) 又是目錄 (-d
)。這證實了測試實際上是在測試字元串的想法:
$ [[ \-fwd ]] && echo "It worked" || echo "not" It worked
用文件測試
$ touch wds $ [[ -fwd wds ]] && echo "It worked" || echo "not" bash: conditional binary operator expected bash: syntax error near `wds'
在 3.2 之後的 bash 版本上給出失敗消息。
對於其他版本,它給出了真實的答案(這對於文件測試是不可能的,目錄條目不能同時是文件和目錄)。
比較這兩個測試,似乎只使用了第一個字母:
$ b204sh -c '[[ -fd wds ]] && echo "It worked" || echo "not"' It worked $ b204sh -c '[[ -df wds ]] && echo "It worked" || echo "not"' not
可能在 bash 4 上更正了一個錯誤
也失敗:
csh
[[: No match.
tcsh
[[: Command not found.
zsh
unknown condition: -fd
# 版本 5.4.2ksh
syntax error at line 3:
wds’ 意外`# 版本 AJM 93u+ 2012-08-01