![Bash 將函數參數識別為程序](https://rvso.com/image/1665759/Bash%20%E5%B0%87%E5%87%BD%E6%95%B8%E5%8F%83%E6%95%B8%E8%AD%98%E5%88%A5%E7%82%BA%E7%A8%8B%E5%BA%8F.png)
我對 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 中的內建命令,但這僅意味著它可以在不產生額外進程的情況下運行,它的行為仍然類似於命令。cat
echo
[
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 個以上參數的test
or命令的結果。[
它可能適用於大多數 shell,但您不能指望它。如果您必須為 POSIX shell 編寫,那麼您應該使用由運算子分隔的兩個test
or[
命令&&
。
請注意,文章詳細闡述了-a
,因此「&&
改為運算子」。在你的情況下,分別是-o
和||
。由操作員分開的兩個測試||
正是我們的解決方案。
答案2
它是if [ "$1" = "clear" ] || [ "$1" = "c" ]
。