Bash 腳本中的字串替換“錯誤替換”

Bash 腳本中的字串替換“錯誤替換”

我嘗試在 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 機制。

相關內容