如何理解關於 (
, )
和 test
的 POSIX 描述?
指定 -a 和 -o 二元基元以及 ‘(’ 和 ‘)’ 運算符的 XSI 擴展已被標記為過時。(許多使用它們的表達式由語法模糊定義,具體取決於被評估的特定表達式。)使用這些表達式的腳本應轉換為下面給出的形式。儘管許多實現將繼續支持這些過時的形式,但在處理使用者提供的輸入時,腳本應該非常小心,因為這些輸入可能會與這些以及其他主要和運算符混淆。除非應用程序開發人員知道產生腳本輸入的所有情況,否則呼叫如下:
test "$1" -a "$2"
應該寫成:
test "$1" && test "$2"
- “’(’ 和 ‘)’ 運算符已被標記為過時”。
是
(
和)
操作員對命令進行分組並創建子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; }
很容易看出這種模式:
test
for 表達式中使用的每個運算符都被替換為 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 ")