Shell

如何理解關於 (, )test 的 POSIX 描述?

  • March 19, 2016

POSIX 2013 開始

指定 -a 和 -o 二元基元以及 ‘(’ 和 ‘)’ 運算符的 XSI 擴展已被標記為過時。(許多使用它們的表達式由語法模糊定義,具體取決於被評估的特定表達式。)使用這些表達式的腳本應轉換為下面給出的形式。儘管許多實現將繼續支持這些過時的形式,但在處理使用者提供的輸入時,腳本應該非常小心,因為這些輸入可能會與這些以及其他主要和運算符混淆。除非應用程序開發人員知道產生腳本輸入的所有情況,否則呼叫如下:

test "$1" -a "$2"

應該寫成:

test "$1" && test "$2"

  1. “’(’ 和 ‘)’ 運算符已被標記為過時”。

()操作員對命令進行分組並創建子shell 嗎?

如果它們已經過時,它們的替代品是什麼? 2. 應該test "$1" -a "$2"換成test "$1" && test "$2", 還是(( test "$1" && test "$2" ))?

我們不需要((...))test在原始命令中那樣返回 0 或 1 嗎?

()操作員對命令進行分組並創建子shell 嗎?

不,該文件提到運算符使用以下方式對錶達式進行分組test

test 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \)

如果它們已經過時,它們的替代品是什麼?

它們的替代品是()and {},類似地,它在 shell 級別對命令進行分組:

test 0 -eq 0 && (test -0 -eq 1 || test 1 -eq 1)
test 0 -eq 0 && { test -0 -eq 1 || test 1 -eq 1; }

很容易看出這種模式:testfor 表達式中使用的每個運算符都被替換為 shell 的等效 for 命令。

應該test "$1" -a "$2"換成test "$1" && test "$2", 還是(( test "$1" && test "$2" ))?

它應該替換為test "$1" && test "$2"; (())用於算術擴展,與命令的退出狀態無關,因為它的目的是評估算術表達式。例如,這將是有效的:

(( $(test 1 -eq 1 && echo $?) && $(test 0 -eq 0 && echo $?) ))

(注意命令替換,它們被內部命令的退出狀態替換,0並且0; 評估的表達式實際上是(( 0 && 0 )))。

但這會導致語法錯誤:

(( test 1 -eq 1 && test 0 -eq 0 ))
$ (( test 1 -eq 1 && test 0 -eq 0 ))
bash: ((: test 1 -eq 1 && test 0 -eq 0 : syntax error in expression (error token is "1 -eq 1 && test 0 -eq 0 ")

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