[英]How do I syntax check a Bash script without running it?
是否可以在不執行的情況下檢查 bash 腳本語法?
使用 Perl,我可以運行perl -c 'script name'
。 bash 腳本是否有任何等效的命令?
bash -n scriptname
也許一個明顯的警告:這會驗證語法,但不會檢查您的 bash 腳本是否嘗試執行不在您的路徑中的命令,例如ech hello
而不是echo hello
。
時間會改變一切。 這是一個為 shell 腳本提供在線語法檢查的網站。
我發現它在檢測常見錯誤方面非常強大。
ShellCheck是一個用於 sh/bash 腳本的靜態分析和 linting 工具。 它主要專注於處理典型的初級和中級語法錯誤和陷阱,其中 shell 只是給出一個神秘的錯誤消息或奇怪的行為,但它也報告了一些更高級的問題,這些問題可能導致延遲失敗。
Haskell 源代碼在 GitHub 上可用!
我還在我編寫的每個 bash 腳本上啟用了 'u' 選項,以便進行一些額外的檢查:
set -u
這將報告未初始化變量的使用情況,如以下腳本“check_init.sh”
#!/bin/sh
set -u
message=hello
echo $mesage
運行腳本:
$ check_init.sh
將報告以下內容:
./check_init.sh[4]: 消息:未設置參數。
非常有用的捕捉錯別字
sh -n script-name
運行這個。 如果腳本中有任何語法錯誤,則返回相同的錯誤消息。 如果沒有錯誤,那么它會在不給出任何消息的情況下出現。 您可以立即使用echo $?
, 將返回0
確認成功,沒有任何錯誤。
它對我很有效。 我在 Linux 操作系統、Bash Shell 上運行。
我實際上檢查了當前目錄中的所有 bash 腳本是否存在語法錯誤,而沒有使用find
工具運行它們:
例子:
find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"
如果要將它用於單個文件,只需編輯帶有文件名的通配符。
null 命令 [colon] 在調試以查看變量值時也很有用
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
IntelliJ IDEA有BashSupport 插件可以檢查語法。
如果您需要在一個變量中確定目錄中所有文件的有效性(git pre-commit hook,構建 lint 腳本),您可以捕獲“sh -n”或“bash -n”命令的 stderr 輸出(參見其他答案)在一個變量中,並有一個基於它的“if/else”
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
根據您的需要將“sh”更改為“bash”
如果您啟用語法檢查,Bash shell 腳本將運行 Synatx 檢查
set -o noexec
如果你想關閉語法檢查
set +o noexec
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.