@ এসএলএম ইতিমধ্যে পসিক্স ডক্সকে অন্তর্ভুক্ত করেছে - যা খুব সহায়ক - তবে কীভাবে এই পরামিতিগুলি একে অপরকে প্রভাবিত করতে একত্রিত করা যায় সে সম্পর্কে তারা সত্যই প্রসারিত করে না। এই ফর্মটির এখানে এখনও কোনও উল্লেখ নেই:
${var?if unset parent shell dies and this message is output to stderr}
এটি আমার অন্য একটি উত্তরের একটি অংশ, এবং আমি মনে করি এটি কীভাবে এই কাজ করে তা খুব ভালভাবে প্রদর্শন করে:
sh <<-\CMD
_input_fn() { set -- "$@" #redundant
echo ${*?WHERES MY DATA?}
#echo is not necessary though
shift #sure hope we have more than $1 parameter
: ${*?WHERES MY DATA?} #: do nothing, gracefully
}
_input_fn heres some stuff
_input_fn one #here
# shell dies - third try doesnt run
_input_fn you there?
# END
CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?
একই থেকে অন্য একটি উদাহরণ :
sh <<-\CMD
N= #N is NULL
_test=$N #_test is also NULL and
v="something you would rather do without"
( #this subshell dies
echo "v is ${v+set}: and its value is ${v:+not NULL}"
echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
${_test:+${N:?so you test for it with a little nesting}}
echo "sure wish we could do some other things"
)
( #this subshell does some other things
unset v #to ensure it is definitely unset
echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
${_test:+${N:?is never substituted}}
echo "so now we can do some other things"
)
#and even though we set _test and unset v in the subshell
echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
# END
CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without
উপরের উদাহরণটি পসিক্স প্যারামিটার বিকল্পের সমস্ত 4 ফর্ম এবং তাদের বিভিন্ন :colon null
বা not null
পরীক্ষার সুবিধা গ্রহণ করে। উপরের লিঙ্কটিতে আরও তথ্য রয়েছে এবং এটি আবার এখানে রয়েছে ।
লোকেদের প্রায়শই বিবেচনা করা হয় না ${parameter:+expansion}
তা হ'ল এখানে-নথিতে এটি কতটা কার্যকর হতে পারে। এখানে ভিন্ন উত্তর থেকে অন্য একটি অংশ দেওয়া হয়েছে :
শীর্ষ
এখানে আপনি কিছু ডিফল্ট সেট করবেন এবং ডেকে এগুলি মুদ্রণের জন্য প্রস্তুত হবেন ...
#!/bin/sh
_top_of_script_pr() (
IFS="$nl" ; set -f #only split at newlines and don't expand paths
printf %s\\n ${strings}
) 3<<-TEMPLATES
${nl=
}
${PLACE:="your mother's house"}
${EVENT:="the unspeakable."}
${ACTION:="heroin"}
${RESULT:="succeed."}
${strings:="
I went to ${PLACE} and saw ${EVENT}
If you do ${ACTION} you will ${RESULT}
"}
#END
TEMPLATES
MIDDLE
আপনি অন্য ফাংশনগুলির ফলাফলের উপর ভিত্তি করে আপনার মুদ্রণ ফাংশনটিতে কল করার জন্য এটি সংজ্ঞা দিয়েছেন ...
EVENT="Disney on Ice."
_more_important_function() { #...some logic...
[ $((1+one)) -ne 2 ] && ACTION="remedial mathematics"
_top_of_script_pr
}
_less_important_function() { #...more logic...
one=2
: "${ACTION:="calligraphy"}"
_top_of_script_pr
}
থেকে BOTTOM
আপনার এখন এটি সমস্ত সেটআপ হয়ে গেছে, সুতরাং আপনি যেখানে ফলাফলগুলি কার্যকর করবেন এবং টানবেন তা এখানে।
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
ফলাফল
আমি কেন এক মুহুর্তের মধ্যে চলে যাব, তবে উপরোক্ত চালনা করলে নিম্নলিখিত ফলাফল পাওয়া যায়:
_less_important_function()'s
প্রথম রান:
আমি তোমার মায়ের বাড়িতে গিয়ে দেখলাম ডিজনি অন আইস।
আপনি যদি ক্যালিগ্রাফি করেন তবে আপনি সফল হবেন।
তারপর _more_important_function():
আমি কবরস্থানে গিয়ে দেখি ডিজনি অন আইস।
যদি আপনি না নিরাময়কারী গণিত আপনি সফল হবে।
_less_important_function()
আবার
আমি কবরস্থানে গিয়ে দেখি ডিজনি অন আইস।
প্রতিকারমূলক গণিতটি করলে আপনি আফসোস করবেন ।
কিভাবে এটা কাজ করে:
এখানে মূল বৈশিষ্ট্যটি হ'ল ধারণাটি হ'ল conditional ${parameter} expansion.
আপনি যদি কোনও ফর্মটি সেট না করে বা নাল হয়ে থাকে তবেই কোনও মানকে একটি পরিবর্তনশীল সেট করতে পারেন:
${var_name
: =desired_value}
পরিবর্তে আপনি যদি কেবল একটি আনসেট ভেরিয়েবল সেট করতে চান তবে আপনি বাদ পড়বেন :colon
এবং নাল মানগুলি যেমন থাকবে তেমন থাকবে।
স্কোপে:
আপনি লক্ষ্য করতে পারেন যে উপরের উদাহরণে $PLACE
এবং ইতিমধ্যে বলা হয়ে গেলেও $RESULT
সেট হয়ে গেলে পরিবর্তিত হয়ে উঠবেন, সম্ভবত এটি চালানোর সময় সেগুলি সেট করুন। এটি কাজ করার কারণটি হ'ল এটি একটি ফাংশন - আমি অন্যের জন্য ব্যবহৃত না হয়ে এটি এটিকে ঘিরে রেখেছি । যেহেতু এটিকে একটি সাবশেলে ডাকা হয়, তাই এটি নির্ধারিত প্রতিটি পরিবর্তনশীল হয় এবং এটি তার পিতামাতার শেলের কাছে ফিরে আসে সেই মানগুলি অদৃশ্য হয়ে যায়।parameter expansion
_top_of_script_pr()
_top_of_script_pr()
( subshelled )
parens
{ curly braces }
locally scoped
তবে _more_important_function()
সেটগুলি যখন $ACTION
এটি হয় globally scoped
তখন এটি _less_important_function()'s
দ্বিতীয় মূল্যায়নকে প্রভাবিত করে $ACTION
কারণ কেবলমাত্র মাধ্যমে _less_important_function()
সেট করে$ACTION
${parameter:=expansion}.
man bash
; "প্যারামিটার সম্প্রসারণ" ব্লকটি অনুসন্ধান করুন (প্রায় ২৮%)। এই অ্যাসাইনমেন্টগুলি উদাহরণস্বরূপ ডিফল্ট ফাংশন: "ডিফল্ট মানটি তখনই ব্যবহার করুন যদি কোনওটি এখনও সেট না করা হয়।"