উত্তর:
bash -n scriptname
সম্ভবত একটি সুস্পষ্ট সতর্কবাণী: এটি সিনট্যাক্সকে বৈধ করে তবে আপনার ব্যাশ স্ক্রিপ্টটি কোনও আদেশের ech hello
পরিবর্তে আপনার পথে নেই এমন আদেশটি কার্যকর করার চেষ্টা করে কিনা তা পরীক্ষা করে না echo hello
।
set
করে যা এটি করে।
if ["$var" == "string" ]
পরিবর্তে কোনও হারিয়ে যাওয়া জায়গার কারণে কোনও ত্রুটি ধরা পড়বে নাif [ "$var" == "string" ]
type [
"[এটি একটি শেল বিল্টিন") বলে। এটি শেষ পর্যন্ত test
প্রোগ্রামটিতে প্রতিনিধিত্ব করে তবে এটি একটি বন্ধনী বন্ধনীও আশা করে। সুতরাং এটি এর মতো if test"$var"
, যা লেখক বোঝাতে চেয়েছিলেন তা নয়, তবে সিন্টেক্সিকভাবে বৈধ (বলুন $ var এর "a" এর মান রয়েছে, তারপরে আমরা "বাশ: টেস্টা: কমান্ড খুঁজে পাইনি") দেখতে পাব। পয়েন্টটি হ'ল সিন্ট্যাক্টিকভাবে, কোনও অনুপস্থিত জায়গা নেই।
[
ক্ষেত্রে যদি বিল্টিনকে কেবল তখনই অনুরোধ করা $var
হয় । যদি একটি খালি-খালি স্ট্রিংয়ে প্রসারিত হয় , তবে সেই স্ট্রিং দিয়ে সংশ্লেষিত হয় এবং বাশ দ্বারা একটি কমান্ড নাম ( ফাংশন নাম নয়) হিসাবে ব্যাখ্যা করা হয়, এবং হ্যাঁ, এটি সিন্টেক্সিকভাবে বৈধ, তবে আপনি যেমন বলেছিলেন , সম্ভবত উদ্দেশ্যটি নয়। আপনি ব্যবহার করেন তাহলে পরিবর্তে , যদিও একটি শেল হল শব্দ (বরং একটি builtin চেয়ে), আপনি কারণ অনিচ্ছাকৃত স্ট্রিং সংযুক্তকরণের এখনও শব্দ স্বীকৃতি অগ্রাহ্য, একই ফলাফল পাবেন। $var
[
[[
[
[[
["$var"
হয় চিহ্নগুলি সিন্টেক্সের একটি বৈধ কম্যান্ড-নাম অভিব্যক্তি; একইভাবে, টোকেনগুলি ==
এবং "$string"
বৈধ কমান্ড আর্গুমেন্ট । (সাধারণত, builtin [
সঙ্গে পার্স করা হয় কমান্ড , সিনট্যাক্স যেহেতু [[
- একটি শেল হিসাবে শব্দ - ভিন্নভাবে পার্স হয়।) শেল builtin [
নেই না প্রতিনিধিত্ব "করতে test
প্রোগ্রাম" (বহিরাগত উপযোগ): bash
, dash
, ksh
, zsh
সব আছে builtin উভয়ের সংস্করণ [
এবংtest
, এবং তারা তাদের বাহ্যিক-ইউটিলিটি অংশগুলিকে কল করে না ।
সময় সবকিছু বদলে দেয়। এখানে এমন একটি ওয়েবসাইট রয়েছে যা শেল স্ক্রিপ্টের জন্য অনলাইন সিনট্যাক্স চেক সরবরাহ করে।
আমি দেখতে পেয়েছি এটি সাধারণ ত্রুটিগুলি সনাক্ত করা খুব শক্তিশালী।
শেলচেক sh / বাশ স্ক্রিপ্টগুলির জন্য একটি স্থিতিশীল বিশ্লেষণ এবং আবদ্ধকরণ সরঞ্জাম। এটি মূলত সাধারণ প্রাথমিক এবং মধ্যবর্তী স্তরের সিনট্যাক্স ত্রুটিগুলি এবং সমস্যাগুলি পরিচালনা করার দিকে দৃষ্টি নিবদ্ধ করে যেখানে শেলটি কেবল একটি ক্রিপ্টিক ত্রুটি বার্তা বা অদ্ভুত আচরণ দেয় তবে এটি আরও কয়েকটি উন্নত ইস্যুতে রিপোর্ট করে যেখানে কোণার ক্ষেত্রে বিলম্বিত ব্যর্থতার কারণ হতে পারে।
হাসিটেল সোর্স কোডটি গিটহাবে পাওয়া যায়!
apt-get install shellcheck
trusty-backports
।
কিছু অতিরিক্ত চেক করার জন্য আমি লিখি প্রতিটি বাশ স্ক্রিপ্টে 'ইউ' বিকল্পটি সক্ষম করে:
set -u
এটি নিম্নলিখিত স্ক্রিপ্টের মতো 'চেক_ইনিট.শ' এর মতো অবিচ্ছিন্ন ভেরিয়েবলগুলির ব্যবহারের প্রতিবেদন করবে
#!/bin/sh
set -u
message=hello
echo $mesage
স্ক্রিপ্ট চলছে:
$ check_init.sh
নিম্নলিখিত রিপোর্ট করবেন:
./check_init.shmitted4]: ম্যাসেজ: প্যারামিটার সেট করা নেই।
টাইপগুলি ধরার জন্য খুব দরকারী
set -u
যদিও এই সত্যিই, প্রশ্নের উত্তর না কারণ আপনি ত্রুটি বার্তা পেতে স্ক্রিপ্ট চালানোর আছে। এমনকি bash -n check_init.sh
সেই সতর্কতাটিও দেখায় না
sh -n script-name
এই চালান। স্ক্রিপ্টে যদি কোনও সিনট্যাক্স ত্রুটি থাকে তবে এটি একই ত্রুটি বার্তাটি দেয়। যদি কোনও ত্রুটি না থাকে তবে কোনও বার্তা না দিয়েই তা বেরিয়ে আসে। আপনি ব্যবহার করে তত্ক্ষণাত্ পরীক্ষা করতে পারেন echo $?
, যা ফিরে আসবে0
কোনও ভুল ছাড়াই সফলতার সাথে নিশ্চিত হয়ে ।
এটা আমার জন্য ভাল কাজ করে। আমি লিনাক্স ওএস, বাশ শেলের উপর দৌড়েছি।
sh -n
সম্ভবত স্ক্রিপ্টটি বৈধ বাশ স্ক্রিপ্ট কিনা তা পরীক্ষা করবে না। এটি মিথ্যা নেতিবাচক দিতে পারে। sh
কিছু বোর্ন শেল বৈকল্পিক যা সাধারণত বাশ নয়। উদাহরণস্বরূপ উবুন্টু লিনাক্সে realpath -e $(command -v sh)
/ বিন / ড্যাশ দেয়
find
টুল ব্যবহার করে চালিয়ে ব্যতীত সিনট্যাক্স ত্রুটির জন্য আমি বর্তমান দির সমস্ত বাশ স্ক্রিপ্টগুলি পরীক্ষা করে দেখি :
উদাহরণ:
find . -name '*.sh' -exec bash -n {} \;
আপনি যদি এটি কোনও একক ফাইলের জন্য ব্যবহার করতে চান তবে কেবল ফাইলের নাম সহ ওয়াইল্ডকার্ড সম্পাদনা করুন।
নেই BashSupport প্লাগইন জন্য IntelliJ আইডিয়া যা চেক সিনট্যাক্স।
.sh
বাশ স্ক্রিপ্টগুলির সাথে সম্পর্কিত বা অন্য এক্সটেনশনের সাথে না শেষ হলে এটি কাজ করবে না , আপনি যদি ইআরবির মতো কিছু টেম্প্লেটিং সরঞ্জাম ব্যবহার করে স্ক্রিপ্টগুলি তৈরি করেন তবে ক্ষেত্রে এটি হয় (তারপরে সেগুলি শেষ হয় .erb
)। আপনি যদি এটি স্থির করতে চান তবে দয়া করে youtrack.jetbrains.com/issue/IDEA-79574 এর জন্য ভোট দিন !
আপনার যদি কোনও ভেরিয়েবলের মধ্যে ডিরেক্টরিতে সমস্ত ফাইলের বৈধতা প্রয়োজন (গিট প্রি-কমিট হুক তৈরি করুন, লিঙ্ক লিপি স্ক্রিপ্ট), আপনি "sh -n" বা "bash -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
আপনার প্রয়োজনের উপর নির্ভর করে "বাশ" দিয়ে "sh" পরিবর্তন করুন