Bash

bash的條件表達式中的-a和-e有什麼區別?

  • November 13, 2021

來自man bash

CONDITIONAL EXPRESSIONS
[...]
      -a file
             True if file exists.
[...]
      -e file
             True if file exists.
  1. [ -a $FILE ]那麼和之間有什麼區別[ -e $FILE ](如果有的話)?
  2. 如果沒有真正的區別,為什麼存在兩個用於相同目的的標誌?

bash, 帶有兩個參數test命令的上下文,-a file-e file是相同的。但它們有一些區別,因為-a也是二元運算符。

-e一元由 POSIX 定義,但-a一元不是。POSIX 只定義-a二進制(參見測試POSIX)。

POSIX 定義了三個參數test行為:

3個論點:

  • 如果 $ 2 is a binary primary, perform the binary test of $ 1 美元和 3 美元。
  • 如果 $ 1 is ‘!’, negate the two-argument test of $ 2 和 3 美元。
  • 如果 $ 1 is ‘(’ and $ 3 是 ‘)’,執行一元測試 $ 2. On systems that do not support the XSI option, the results are unspecified if $ 1 是’(’,$3 是’)’。
  • 否則,會產生未指定的結果。

所以-a也會導致奇怪的結果:

$ [ ! -a . ] && echo true
true

-a在三個參數的上下文中被視為二元運算符。請參閱Bash FAQ 問題 E1。POSIX 還提到它-a是從 KornShell 獲取的,但後來被更改為,-e因為它混淆了-a二進制和-a一元。

添加了具有與 C shell 提供的功能相似的功能的 -e 主項,因為它為 shell 腳本提供了在不嘗試打開文件的情況下找出文件是否存在的唯一方法。由於允許實現添加其他文件類型,可移植腳本不能使用:

測試 -b foo -o -c foo -o -d foo -o -f foo -o -p foo

找出 foo 是否是現有文件。在歷史悠久的 BSD 系統上,文件的存在可以通過以下方式確定:

測試 -f foo -o -d foo

但是沒有簡單的方法可以確定現有文件是正常文件。早期的提議使用了 KornShell -a 主運算符(具有相同的含義),但它被更改為 -e,因為人們擔心人類很可能將 -a 主運算符與 -a 二元運算符混淆。

-abinary 也被標記為過時的,因為它會導致一些模棱兩可的表達式,它有超過 4 個參數。使用這些 >4 個參數表達式,POSIX 定義了未指定的結果。

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