Bash

如何在bash的if語句中嵌套條件腳本運算符-a -o

  • September 24, 2021

如果我想在 if 語句中組合 -a 和 -o 腳本運算符,我該怎麼做?例如:

if [ ( -e file.txt -a -r file.txt ) -o ( -e file2.txt -a -r file2.txt ) ]; then .... fi

我可以完成這樣的事情嗎?現在,當我嘗試執行它時出現錯誤。

使用雙括號(請參閱[為什麼使用不帶引號的空格的參數擴展在雙括號“[[”內有效,但在單括號“”內無效?)。使用&&||雙括號條件運算符而不是-a-o測試/單括號條件運算符。這適用於 bash,也適用於 ksh 和 zsh,但不適用於普通 sh。

if [[ ( -e file.txt && -r file.txt ) || ( -e file2.txt && -r file2.txt ) ]]; then

或者,對於單方括號,使用[單次檢查,在括號外使用&&and ||shell 運算符而不是在括號內使用-a-o測試運算符,並{ … }用於分組(請參閱終端中括號和大括號之間的區別?)。這適用於任何 sh 樣式的 shell。

if { [ -e file.txt ] && [ -r file.txt ]; } ||
  { [ -e file2.txt ] && [ -r file2.txt ]; }
then …

或者,您可以在單括號內使用\(and \)(或任何其他引用括號的方式)(再次,請參閱[Why does parameter expansion with spaces without quotes works inside double bracket “[[” but not inside single bracket “”? for an解釋)。但是,如果文件名看起來像測試運算符 ( (, =, -e, …),這可能會導致條件解析不正確。

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