Bash

通過組合標誌測試多個文件條件——它有效嗎?

  • December 27, 2017

我在 StackOverflow 上的回答至少獲得了兩次贊成票,它在我以前工作場所使用的工作站的外殼上起作用。在那個可能是 SunOS 或 Red Hat Commercial Linux 或 Red Hat Enterprise Linux 的舊版本的工作站上,測試正常文件和可寫目錄的存在。, , ,並且是該工作站上唯一可能安裝的 shell,我很可能在.[[ -fwdpath]]pathsh``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.2

ksh syntax error at line 3: wds’ 意外`# 版本 AJM 93u+ 2012-08-01

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