প্যারামিটার সম্প্রসারণ
সুস্পষ্ট উত্তর হ'ল প্যারামিটার বিস্তারের বিশেষ ফর্মগুলির মধ্যে একটি ব্যবহার করা:
: ${STATE?"Need to set STATE"}
: ${DEST:?"Need to set DEST non-empty"}
বা, আরও ভাল (নীচে 'ডাবল উদ্ধৃতিগুলির অবস্থানের' বিভাগ দেখুন):
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
প্রথম রূপটি (কেবলমাত্র ব্যবহার করে ?
) সেট করার জন্য স্টেট প্রয়োজন, তবে স্টেট = "" (একটি খালি স্ট্রিং) ঠিক আছে - আপনি যা চান ঠিক তা নয়, বিকল্প এবং পুরানো স্বরলিপি।
দ্বিতীয় বৈকল্পিক (ব্যবহার করে :?
) এর জন্য DEST সেট করা এবং খালি নয়।
আপনি যদি কোনও বার্তা সরবরাহ না করেন তবে শেলটি একটি ডিফল্ট বার্তা সরবরাহ করে।
${var?}
কনস্ট্রাক্ট সংস্করণ 7 ইউনিক্স এবং বোর্ন শেল (1978 বা এর কাছাকাছি) এর পোর্টেবল ফিরে। ${var:?}
কনস্ট্রাক্ট সামান্য বেশি সাম্প্রতিক হল: আমার মনে হয় এটা 1981 প্রায় সিস্টেম তৃতীয় ইউনিক্স ছিল, কিন্তু এটা তার আগে PWB ইউনিক্স মধ্যে ছিল। এটি কার্ন শেল এবং বিশেষত বাশ সহ পসিক্স শেলগুলিতে।
এটি প্যারামিটার এক্সপেনশন নামে একটি বিভাগে শেলের ম্যান পৃষ্ঠাতে নথিভুক্ত হয় । উদাহরণস্বরূপ, bash
ম্যানুয়ালটি বলে:
${parameter:?word}
নাল বা আনসেট না হলে ডিসপ্লে ত্রুটি। যদি প্যারামিটারটি নাল বা আনসেট না হয় তবে শব্দের সম্প্রসারণ (বা শব্দটি উপস্থিত না থাকলে সেই প্রভাবের জন্য একটি বার্তা) স্ট্যান্ডার্ড ত্রুটি এবং শেলটিতে লেখা হয়, যদি এটি ইন্টারেক্টিভ না হয় তবে প্রস্থান করে। অন্যথায়, প্যারামিটারের মান প্রতিস্থাপিত হয়।
কর্নেল কমান্ড
আমার সম্ভবত যুক্ত করা উচিত যে কোলন কমান্ডটি কেবল তার যুক্তিগুলি মূল্যায়ন করে এবং তারপরে সফল হয়। এটি আসল শেল কমেন্টেশন স্বরলিপি ( #
লাইনের শেষে ' ' এর আগে )। দীর্ঘদিন ধরে, বোর্ন শেল স্ক্রিপ্টগুলির প্রথম অক্ষর হিসাবে কোলন ছিল। সি শেল একটি স্ক্রিপ্ট পড়ে এবং প্রথম অক্ষরটি নির্ধারণ করতে ব্যবহৃত যে এটি শেল (একটি #
'হ্যাশ) বা বোর্ন শেল (একটি' :
'কোলন) এর জন্য ছিল কিনা তা নির্ধারণ করার জন্য । তারপরে কার্নেলটি এই অভিনেত্রীর সাথে যোগ দেয় এবং ' #!/path/to/program
' এর জন্য সমর্থন যোগ করে এবং বোর্ন শেল'র #
মন্তব্য পেয়ে যায় এবং কোলন কনভেনশনটি পথ ধরে যায়। তবে আপনি যদি কোনও স্ক্রিপ্ট জুড়ে এসেছেন যা কোলন দিয়ে শুরু হয়, তবে এখন আপনি কেন তা জানতে পারবেন।
ডাবল উদ্ধৃতি অবস্থান
ব্লং একটি মন্তব্যে জিজ্ঞাসা :
এই আলোচনা কোন চিন্তা? https://github.com/koalaman/shellcheck/issues/380#issuecomment-145872749
আলোচনার মূল বক্তব্য:
… যাইহোক, আমি যখন shellcheck
এটি (0.4.1 সংস্করণ সহ) করব তখন আমি এই বার্তাটি পাই:
In script.sh line 13:
: ${FOO:?"The environment variable 'FOO' must be set and non-empty"}
^-- SC2086: Double quote to prevent globbing and word splitting.
এই ক্ষেত্রে আমার কী করা উচিত সে সম্পর্কে কোনও পরামর্শ?
সংক্ষিপ্ত উত্তরটি " shellcheck
পরামর্শ অনুসারে করুন":
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
কেন উদাহরণস্বরূপ, নিম্নলিখিত অধ্যয়ন করুন। নোট করুন যে :
কমান্ডটি তার আর্গুমেন্টগুলি প্রতিধ্বনিত করে না (তবে শেলটি আর্গুমেন্টগুলি মূল্যায়ন করে)। আমরা যুক্তিগুলি দেখতে চাই, সুতরাং নীচের কোডটি তার printf "%s\n"
জায়গায় ব্যবহার করে :
।
$ mkdir junk
$ cd junk
$ > abc
$ > def
$ > ghi
$
$ x="*"
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
abc
def
ghi
$ unset x
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
bash: x: You must set x
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
bash: x: You must set x
$ x="*"
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
*
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
abc
def
ghi
$ x=
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$ unset x
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$
মানটি কীভাবে $x
প্রথমে প্রসারিত হবে *
এবং তারপরে সামগ্রিক অভিব্যক্তি ডাবল উদ্ধৃতিতে না থাকলে ফাইলের নামের একটি তালিকা নোট করুন । এটি ঠিক করা shellcheck
উচিত যা সুপারিশ করা হয়। আমি যাচাই করে দেখিনি যে যেখানে ফর্মটি ডাবল উদ্ধৃতিতে আবদ্ধ রয়েছে তাতে এটি আপত্তি করে না, তবে এটি যুক্তিযুক্ত অনুমান যে এটি ঠিক হবে।