簡體   English   中英

如何在不運行 Bash 腳本的情況下對其進行語法檢查?

[英]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

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 IDEABashSupport 插件可以檢查語法。

僅用於驗證語法:

shellcheck [程序路徑]

僅在語法通過時才運行程序,因此調試語法和執行:

防殼[程序路徑]

如果您需要在一個變量中確定目錄中所有文件的有效性(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM