जवाबों:
bash -n scriptname
शायद एक स्पष्ट चेतावनी: यह सिंटैक्स को मान्य करता है लेकिन यह जांच नहीं करेगा कि क्या आपकी बैश स्क्रिप्ट एक कमांड को निष्पादित करने का प्रयास करती है जो आपके रास्ते में नहीं है, जैसे ech hello
कि echo hello
।
set
करता है जो करता है।
if ["$var" == "string" ]
बजायif [ "$var" == "string" ]
type [
"[एक शेल बिल्डिन है"। यह अंततः test
कार्यक्रम को दर्शाता है , लेकिन यह एक समापन ब्रैकेट की भी उम्मीद करता है। तो यह ऐसा है if test"$var"
, जो ऐसा नहीं है कि लेखक का क्या मतलब है, लेकिन वाक्यगत रूप से मान्य है (कहते हैं कि $ var का मूल्य "a" है, तो हम "bash: testa: command not found") देखेंगे। बिंदु यह है कि वाक्यात्मक रूप से, कोई लापता स्थान नहीं है।
[
यदि खाली स्ट्रिंग$var
का विस्तार करने के लिए होता है, तो केवल इस मामले में निर्मित किया जाता है । यदि कोई गैर-रिक्त स्ट्रिंग में फैलता है , तो उस स्ट्रिंग के साथ सम्मिलित किया जाता है और बैश द्वारा कमांड नाम ( फ़ंक्शन नाम नहीं ) के रूप में व्याख्या की जाती है , और, हाँ, यह वाक्यात्मक रूप से मान्य है, लेकिन, जैसा कि आप कहते हैं, स्पष्ट रूप से इरादा नहीं है। यदि आप इसके बजाय उपयोग करते हैं , भले ही एक शेल कीवर्ड (एक बिल्डिन के बजाय) है, तो आपको एक ही परिणाम मिलेगा, क्योंकि अनपेक्षित स्ट्रिंग कॉन्सेप्टन अभी भी कीवर्ड की मान्यता को ओवरराइड करता है। $var
[
[[
[
[[
["$var"
है वाक्य रचना एक वैध कमांड नाम अभिव्यक्ति; इसी तरह, टोकन ==
और "$string"
मान्य कमांड तर्क हैं । (आम तौर पर, निर्मित [
साथ पार्स किया गया है आदेश वाक्य रचना, जबकि [[
- एक खोल के रूप में कीवर्ड - अलग ढंग से पार्स किया गया है।) खोल निर्मित [
करता नहीं सौंपने "के test
कार्यक्रम" (बाह्य उपयोगिता): bash
, dash
, ksh
, zsh
सभी builtin दोनों संस्करणों [
औरtest
, और वे अपने बाहरी-उपयोगिता समकक्षों को नहीं बुलाते हैं।
समय सब कुछ बदल देता है। यहां एक वेब साइट है जो शेल स्क्रिप्ट के लिए ऑनलाइन सिंटैक्स चेकिंग प्रदान करती है।
मैंने पाया कि यह सामान्य त्रुटियों का पता लगाने में बहुत शक्तिशाली है।
ShellCheck एक स्थिर विश्लेषण और श / बश लिपियों के लिए लाइनिंग उपकरण है। यह मुख्य रूप से विशिष्ट शुरुआती और मध्यवर्ती स्तर के सिंटैक्स त्रुटियों और नुकसान से निपटने पर केंद्रित है जहां शेल सिर्फ एक गुप्त त्रुटि संदेश या अजीब व्यवहार देता है, लेकिन यह कुछ और उन्नत मुद्दों पर भी रिपोर्ट करता है जहां कोने के मामले देरी विफलताओं का कारण बन सकते हैं।
Haskell source कोड GitHub पर उपलब्ध है!
apt-get install shellcheck
trusty-backports
।
मैं कुछ अतिरिक्त जाँच करने के लिए प्रत्येक बैश स्क्रिप्ट पर 'u' विकल्प को भी सक्षम करता हूँ:
set -u
यह निम्नलिखित स्क्रिप्ट 'check_init.sh' की तरह, एकतरफा वैरिएबल के उपयोग की सूचना देगा।
#!/bin/sh
set -u
message=hello
echo $mesage
स्क्रिप्ट चलाना:
$ check_init.sh
निम्नलिखित की रिपोर्ट करेंगे:
./check_init.sh [४]: मेसेज: पैरामीटर सेट नहीं है।
टाइपो को पकड़ने के लिए बहुत उपयोगी है
set -u
यद्यपि यह वास्तव में प्रश्न का उत्तर नहीं देता है, क्योंकि आपको त्रुटि संदेश प्राप्त करने के लिए स्क्रिप्ट को चलाना होगा। bash -n check_init.sh
उस चेतावनी को भी नहीं दिखाता है
sh -n script-name
इसे चलाओ। यदि स्क्रिप्ट में कोई सिंटैक्स त्रुटियां हैं, तो यह वही त्रुटि संदेश देता है। यदि कोई त्रुटि नहीं है, तो यह बिना कोई संदेश दिए निकलता है। आप तुरंत जांच कर सकते हैं echo $?
, जो वापस आ जाएगी0
बिना किसी गलती के सफल होने की पुष्टि ।
इसने मेरे लिए अच्छा काम किया। मैं लिनक्स ओएस, बैश शेल पर भागा।
sh -n
शायद जांच नहीं करेगा कि स्क्रिप्ट मान्य बैश स्क्रिप्ट है। यह गलत नकारात्मक दे सकता है। sh
कुछ बॉर्न शेल वैरिएंट है जो आमतौर पर बैश नहीं होते हैं। उदाहरण के लिए उबंटू में लिनक्स realpath -e $(command -v sh)
/ बिन / डैश देता है
मैं वास्तव में सभी bash स्क्रिप्ट को वर्तमान dir में सिंटैक्स त्रुटियों के लिए जाँचता हूँ, बिना find
टूल का उपयोग किए उन्हें चलाने के बिना :
उदाहरण:
find . -name '*.sh' -exec bash -n {} \;
यदि आप इसे एकल फ़ाइल के लिए उपयोग करना चाहते हैं, तो फ़ाइल के नाम के साथ वाइल्डकार्ड को संपादित करें।
नहीं है BashSupport प्लगइन के लिए IntelliJ विचार जो चेक वाक्य रचना।
.sh
बैश स्क्रिप्ट से जुड़े या अन्य एक्सटेंशन के साथ समाप्त नहीं होती हैं, जो कि अगर आप ईआरबी जैसे कुछ टेम्प्लेटिंग टूल का उपयोग करके स्क्रिप्ट उत्पन्न करते हैं (तब वे समाप्त होते हैं .erb
)। यदि आप इसे तय करना चाहते हैं, तो कृपया youtrack.jetbrains.com/issue/IDEA-79574 पर वोट करें !
यदि आपको एक चर में सभी फाइलों की वैधता एक निर्देशिका (git प्री-कमिट हुक, बिल्ड लिपि स्क्रिप्ट) की आवश्यकता है, तो आप "sh -n" या "bash -n" कमांड के stderr आउटपुट को पकड़ सकते हैं (अन्य देखें) उत्तर) एक चर में, और उसके आधार पर एक "अगर / और" है
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
अपनी आवश्यकताओं के आधार पर "बैश" के साथ "श" बदलें