Bash 將函數參數識別為程序

Bash 將函數參數識別為程序

我對 bash 的語法很陌生,我的「.bash_aliases」檔案中有一段程式碼。它要么獲取一個整數作為參數,要么獲取字母“c”,當它獲取一個整數時,它會將該整數放入環境變量中,網絡伺服器可以將其用作端口。當它收到字母“c”作為輸入時,它會清除該變數。

當我嘗試使用整數運行命令時,出現錯誤

main@linuxWSL:~$ serverp 2000
-bash: [: missing `]'
2000: command not found

當我用字母“c”嘗試時,我得到了

main@linuxWSL:~$ serverp c
-bash: [: missing `]'
c: command not found

這是我的 bash 程式碼:

serverp () {
  if [ "$1" = "clear" || "$1" = "c" ]
  then
    unset PORT
    echo -e "\e$CLEAR$GREEN""mWebServer port has been reset!""$CLEAN"
    return 0
  fi

  export PORT="$1"
}

有人能幫我嗎?謝謝你!

答案1

[不是 Bash 中的關鍵字,它不會使 shell 解析器以不同的方式解釋命令列的其餘部分。是一個類似or 的[命令。(如) 是 Bash 中的內建命令,但這僅意味著它可以在不產生額外進程的情況下運行,它的行為仍然類似於命令。catecho[echo

需要明確的是:[ … ]不是語法的一部分if … then …if只是測試某些程式碼的退出狀態:if true; then …有效,if sleep 5; then …有效,類似if [ … ]; then …有效(如果該[ … ]部分本身是有效命令)。

[您的系統中可能有一個可執行檔。嘗試type -a [。相比於type -a [[。與 ,相反[[[是 Bash 中的一個關鍵字,它確實使解析器特別對待[[和之間的事物]]

[不是關鍵字。正確編寫的[ … ]命令是]最後一個參數。[require]作為最後一個參數,否則它將無法運作。這只是為了讓其[ … ]作為一個塊脫穎而出,就好像它是某種特殊的語法一樣;但這不是特殊的語法。

[ "$1" = "clear" || "$1" = "c" ]被 shell 解釋為[ "$1" = "clear""$1" = "c" ]與 相連||。所以有兩個指令。第一個命令是[ "$1" = "clear"[被執行,它沒有]作為最後一個參數,它抱怨並以非零退出狀態退出。由於非零狀態和||,shell 嘗試執行第二個命令,該命令以"$1"擴展為的內容開頭。這樣,腳本的第一個參數就被解釋為要執行的可執行檔。

[ … || … ]像這樣修復你的:

[ "$1" = "clear" ] || [ "$1" = "c" ]

此片段由兩個組成有效的 [命令。它應該做你想做的事。

Note[[ "$1" = "clear" || "$1" = "c" ]]是一段工作程式碼,而[ "$1" = "clear" || "$1" = "c" ]不是。這是因為[[不是命令。它是一個關鍵字,它使 shell 解析器對所有內容進行]]特殊處理;這包括||.還有其他的[[和之間的差異[,不要盲目互換。

[Bash 中的內建-o支援或者(並且-a對於),所以這也可以工作:

[ "$1" = "clear" -o "$1" = "c" ]

這是您的程式碼||(對 shell 來說是特殊的)被-o(對 shell 來說不是特殊的)取代的。-o但你應該避免。從本文:

二進位-a-o[...] 是 POSIX 標準的 XSI 擴充。所有這些在 POSIX-2008 中都被標記為過時。它們不應該在新程式碼中使用。[ A = B -a C = D ](or )的實際問題之一-o是 POSIX 不指定具有 4 個以上參數的testor命令的結果。[它可能適用於大多數 shell,但您不能指望它。如果您必須為 POSIX shell 編寫,那麼您應該使用由運算子分隔的兩個testor[命令&&

請注意,文章詳細闡述了-a,因此「&&改為運算子」。在你的情況下,分別是-o||。由操作員分開的兩個測試||正是我們的解決方案。

答案2

它是if [ "$1" = "clear" ] || [ "$1" = "c" ]

相關內容