lslm දැනටමත් POSIX ලියකියවිලි ඇතුළත් කර ඇත - ඒවා ඉතා ප්රයෝජනවත් වේ - නමුත් ඒවා එකිනෙකට බලපාන පරිදි මෙම පරාමිතීන් ඒකාබද්ධ කළ හැකි ආකාරය පිළිබඳව සැබවින්ම පුළුල් නොවේ. මෙම පෝරමය පිළිබඳ තවමත් කිසිදු සඳහනක් නොමැත:
${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
ඉහත උදාහරණය POSIX පරාමිති ආදේශනයේ සියලු ආකාර 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
මැද
ප්රති results ල මත පදනම්ව ඔබේ මුද්රණ ශ්රිතය ඇමතීමට වෙනත් කාර්යයන් ඔබ අර්ථ දක්වන්නේ මෙහිදීය ...
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
}
බොටම්
ඔබට දැන් සියල්ල සකසා ඇත, එබැවින් මෙන්න ඔබ ක්රියාත්මක කර ඔබේ ප්රති .ල අදින්න.
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
ප්රතිපල
මම මොහොතකට යන්නට යන්නෙමි, නමුත් ඉහත ධාවනය කිරීමෙන් පහත ප්රති results ල ලැබේ:
_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
; "පරාමිති පුළුල් කිරීම" වාරණය සොයන්න (28% ක් පමණ). මෙම පැවරුම් උදා: පෙරනිමි ශ්රිත: "පෙරනිමි අගය භාවිතා කරන්න කිසිවක් තවම සකසා නොමැති නම් පමණි."