Có thể kiểm tra cú pháp bash script mà không thực hiện nó không?
Sử dụng Perl, tôi có thể chạy perl -c 'script name'
. Có bất kỳ lệnh tương đương cho các tập lệnh bash?
Có thể kiểm tra cú pháp bash script mà không thực hiện nó không?
Sử dụng Perl, tôi có thể chạy perl -c 'script name'
. Có bất kỳ lệnh tương đương cho các tập lệnh bash?
Câu trả lời:
bash -n scriptname
Có lẽ một cảnh báo rõ ràng: cú pháp này xác nhận nhưng sẽ không kiểm tra nếu tập lệnh bash của bạn cố thực thi một lệnh không nằm trong đường dẫn của bạn, như ech hello
thay vì echo hello
.
set
.
if ["$var" == "string" ]
thay vìif [ "$var" == "string" ]
type [
nói "[là một vỏ dựng sẵn". Cuối cùng, nó cũng được ủy quyền cho test
chương trình, nhưng nó cũng mong đợi một khung kết thúc. Vì vậy, nó giống như if test"$var"
, đó không phải là ý của tác giả, nhưng có giá trị về mặt cú pháp (giả sử $ var có giá trị là "a", sau đó chúng ta sẽ thấy "bash: testa: lệnh không tìm thấy"). Điểm là về mặt cú pháp, không có không gian bị thiếu.
[
chỉ được gọi trong trường hợp này nếu $var
tình cờ mở rộng thành một chuỗi rỗng . Nếu $var
mở rộng thành một chuỗi không trống , [
được nối với chuỗi đó và được Bash hiểu là tên lệnh (không phải tên hàm ), và, vâng, đó là hợp lệ về mặt cú pháp , nhưng, như bạn nêu, rõ ràng không phải là ý định. Nếu bạn sử dụng [[
thay vì [
, mặc dù [[
là một từ khóa shell (chứ không phải là dựng sẵn), bạn sẽ nhận được kết quả tương tự, bởi vì nối chuỗi không có chủ ý vẫn ghi đè nhận dạng của từ khóa.
["$var"
là cú pháp một giá trị lệnh tên biểu quan điểm; tương tự, mã thông báo ==
và "$string"
là đối số lệnh hợp lệ . (Nói chung, được xây dựng trong [
được phân tách với lệnh cú pháp, trong khi đó [[
- như một vỏ từ khóa - được phân tách khác nhau.) Các BUILTIN vỏ [
không không giao cho " test
chương trình" (tiện ích bên ngoài): bash
, dash
, ksh
, zsh
tất cả đều có được xây dựng trong các phiên bản của cả hai [
vàtest
và họ không gọi các đối tác tiện ích bên ngoài của họ.
Thời gian thay đổi mọi thứ. Đây là một trang web cung cấp kiểm tra cú pháp trực tuyến cho shell script.
Tôi thấy nó rất mạnh mẽ phát hiện các lỗi phổ biến.
ShellCheck là một công cụ phân tích và linting tĩnh cho các tập lệnh sh / bash. Nó chủ yếu tập trung vào việc xử lý các lỗi cú pháp ở cấp độ sơ cấp và trung cấp điển hình trong đó trình bao chỉ đưa ra thông báo lỗi khó hiểu hoặc hành vi lạ, nhưng nó cũng báo cáo về một số vấn đề nâng cao hơn trong đó các trường hợp góc có thể gây ra lỗi chậm.
Mã nguồn Haskell có sẵn trên GitHub!
apt-get install shellcheck
trusty-backports
.
Tôi cũng kích hoạt tùy chọn 'u' trên mỗi tập lệnh bash tôi viết để thực hiện một số kiểm tra bổ sung:
set -u
Điều này sẽ báo cáo việc sử dụng các biến chưa được khởi tạo, như trong đoạn mã sau 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Chạy tập lệnh:
$ check_init.sh
Sẽ báo cáo như sau:
./check_init.sh[4]: mesage: Tham số không được đặt.
Rất hữu ích để bắt lỗi chính tả
set -u
mặc dù điều này không thực sự trả lời câu hỏi, bởi vì bạn phải chạy tập lệnh để nhận thông báo lỗi. Thậm chí không bash -n check_init.sh
hiển thị cảnh báo đó
sh -n script-name
Chạy cái này Nếu có bất kỳ lỗi cú pháp nào trong tập lệnh, thì nó sẽ trả về cùng một thông báo lỗi. Nếu không có lỗi, thì nó xuất hiện mà không đưa ra bất kỳ thông báo nào. Bạn có thể kiểm tra ngay lập tức bằng cách sử dụng echo $?
, điều này sẽ trở lại 0
xác nhận thành công mà không có bất kỳ sai lầm nào.
Nó làm việc tốt cho tôi. Tôi đã chạy trên hệ điều hành Linux, Bash Shell.
sh -n
có lẽ sẽ không kiểm tra xem tập lệnh có phải là tập lệnh Bash hợp lệ không. Nó có thể đưa ra những tiêu cực sai. sh
là một số biến thể vỏ Bourne thường không phải là Bash. Ví dụ: trong Ubuntu Linux realpath -e $(command -v sh)
cho / bin / dash
Tôi thực sự kiểm tra tất cả các tập lệnh bash trong thư mục hiện tại để tìm lỗi cú pháp mà KHÔNG chạy chúng bằng find
công cụ:
Thí dụ:
find . -name '*.sh' -exec bash -n {} \;
Nếu bạn muốn sử dụng nó cho một tệp, chỉ cần chỉnh sửa ký tự đại diện với tên của tệp.
Có plugin BashSupport cho IntelliJ IDEA để kiểm tra cú pháp.
.sh
hoặc phần mở rộng khác được liên kết với tập lệnh Bash, đó là trường hợp nếu bạn tạo tập lệnh bằng một số công cụ tạo khuôn mẫu như ERB (sau đó chúng kết thúc bằng .erb
). Vui lòng bỏ phiếu cho youtrack.jetbrains.com/su/IDEA-79574 nếu bạn muốn sửa nó!
Nếu bạn cần một biến có hiệu lực của tất cả các tệp trong một thư mục (git pre-commit hook, build lint script), bạn có thể bắt đầu ra stderr của các lệnh "sh -n" hoặc "bash -n" (xem khác câu trả lời) trong một biến và có "nếu / khác" dựa trên đó
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
Thay đổi "sh" bằng "bash" tùy theo nhu cầu của bạn