我嘗試在 bash 腳本中進行基本的字串替換:
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
它在我的 Mac 上運行良好,但在我的伺服器上不起作用。我嘗試了不同網站的不同範例,但總是收到錯誤:
Bad substitution
我的 bash 版本:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
我究竟做錯了什麼?
答案1
echo "${x/Linux/Unix}"
自 1996 年發布的 2.0 版以來,這是 bash 中的正確語法。
Bash 不會發出確切的錯誤訊息Bad substitution
。當它遇到看起來差不多但又不完全一樣的東西(例如參數替換)時,它的訊息略有不同:
$ bash -c '${}'
bash: ${}: bad substitution
另一方面,dash(/bin/sh
在許多 Linux 系統上實現)確實發出了這條確切的訊息:
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
這個錯誤足以暗示,正如庫薩羅南達注意到的,您實際上並沒有將此腳本作為程序運行:您正在運行某個程序,大概是sh
或/bin/sh
,並告訴它運行此腳本。您的腳本是正確的 bash 程序,但不是正確的 sh 程序,因此該腳本無法在 sh 是不同方言且不具有與 bash 相同功能集的系統上運行。
您的腳本是一個獨立的程式。這舍邦腳本頂部的行告訴系統要使用什麼解釋器。要執行該腳本,只需鍵入其路徑或檔案名稱(如果它位於命令搜尋路徑 ( ) 上$PATH
)。與任何其他可執行程式一樣,無論它是腳本(具有 shebang 行)還是其他腳本(核心自行執行的二進位檔案1),它都需要具有執行權限 ( chmod +x path/to/script
)。如果由於某種原因你有一個不是獨立程式的腳本並且你想用 bash 運行它,請運行bash path/to/script
,而不是sh path/to/script
。
1 或使用其他方式來傳達如何執行文件,例如 Linux 上的 binfmt_misc 機制。