দুটি ক্ষেত্রেই আমি :
দরকারী বলে মনে করি:
ডিফল্ট ভেরিয়েবল অ্যাসাইনমেন্ট
#!/bin/sh
# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"
আপনার শেল স্ক্রিপ্টের ব্যবহারকারীদের স্ক্রিপ্টটি সম্পাদনা না করে কোনও সেটিংস ওভাররাইড করার অনুমতি দেওয়ার এটি একটি সুবিধাজনক উপায়। (তবে, কমান্ড-লাইন আর্গুমেন্টগুলি ভাল কারণ আপনি যদি অপ্রত্যাশিত আচরণের ঝুঁকিটি চালান না তবে যদি ব্যবহারকারী কাকতালীয়ভাবে তাদের রফতান পরিবেশে আপনার ব্যবহারযোগ্য পরিবর্তনশীল থাকে।) ব্যবহারকারী কীভাবে সেটিংসটিকে ওভাররাইড করবে:
VAR="other value" ./script
${VAR=value}
সিনট্যাক্স সেট বলল VAR
করতে value
যদি VAR
ইতিমধ্যে সেট না করা হয়, তাহলে ভেরিয়েবলের মান প্রসারিত। যেহেতু আমরা এখনও ভেরিয়েবলের মান সম্পর্কে চিন্তা করি না, তাই এটি :
ফেলে দেওয়ার জন্য কোনও অপ-কমান্ডের আর্গুমেন্ট হিসাবে এটি পাস করা হয়।
যদিও :
কোনও অপ-কমান্ড হলেও , :
কমান্ড চালানোর আগে শেল ( কমান্ড নয়!) দ্বারা সম্প্রসারণ করা হয় :
যাতে ভেরিয়েবল অ্যাসাইনমেন্টটি এখনও ঘটে (যদি প্রযোজ্য হয়)।
এটির true
পরিবর্তে বা অন্য কোনও কমান্ড ব্যবহার করাও গ্রহণযোগ্য হবে :
তবে উদ্দেশ্যটি কম পরিষ্কার হওয়ার কারণে কোডটি পড়া আরও শক্ত হয়ে যায়।
নিম্নলিখিত লিপিটিও কাজ করবে:
#!/bin/sh
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"
তবে উপরোক্ত রক্ষণাবেক্ষণ করা বেশ কঠিন। যদি এই লাইনটির ${VAR}
উপরে কোনও লাইন যুক্ত করা হয় printf
, তবে ডিফল্ট অ্যাসাইনমেন্ট সম্প্রসারণ সরিয়ে নিতে হবে। বিকাশকারী যদি সেই কাজটি সরিয়ে নিতে ভুলে যায় তবে একটি বাগ প্রবর্তিত হবে।
খালি শর্তাধীন ব্লকে কিছু রাখার জন্য
খালি শর্তসাপূর্ণ ব্লকগুলি এড়ানো উচিত, তবে সেগুলি কখনও কখনও দরকারী হয়:
if some_condition; then
# todo: implement this block of code; for now do nothing.
# the colon below is a no-op to prevent syntax errors
:
fi
কিছু লোক যুক্তি দেখান যে একটি খালি সত্যিকারের if
ব্লক থাকার ফলে পরীক্ষার বিষয়টি উপেক্ষা করার চেয়ে কোড পড়া সহজ করা যায়। উদাহরণ স্বরূপ:
if [ -f foo ] && bar || baz; then
:
else
do_something_here
fi
এর চেয়ে পড়ার পক্ষে তর্কযোগ্যভাবে সহজ:
if ! [ -f foo ] || ! bar && ! baz; then
do_something_here
fi
তবে আমি বিশ্বাস করি যে কয়েকটি বিকল্প উপায় আছে যা খালি সত্যিকারের ব্লকের চেয়ে ভাল:
শর্তটি একটি ফাংশনে রাখুন:
exotic_condition() { [ -f foo ] && bar || baz; }
if ! exotic_condition; then
do_something_here
fi
শর্তটি কোঁকড়া ধনুর্বন্ধনী (বা বন্ধনীর ভিতরে রাখুন, তবে বন্ধনীগুলি একটি সাব-শেল প্রক্রিয়া উত্পন্ন করে এবং সাবশেলের অভ্যন্তরে পরিবেশে যে কোনও পরিবর্তন ঘটে তা সাবহেলের বাইরে দৃশ্যমান হবে না):
if ! { [ -f foo ] && bar || baz; } then
do_something_here
fi
এর ||
পরিবর্তে ব্যবহার করুন if
:
[ -f foo ] && bar || baz || {
do_something_here
}
প্রতিক্রিয়াগুলি যখন একটি সাধারণ এক-লাইনার যেমন শর্তগুলি জোর দেওয়া হয় তখন আমি এই পদ্ধতির পছন্দ করি:
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
[ -f foo ] && bar || baz || fatal "condition not met"