ඔබ නම් කරන ලද පරාමිතීන් කැමති නම්, (උපක්රම කිහිපයක් සමඟ) ඇත්ත වශයෙන්ම නම් කරන ලද පරාමිතීන් ශ්රිත වෙත යැවිය හැකිය (අරා සහ යොමු යොමු කිරීමට ද එය සමත් වේ).
මා විසින් සකස් කරන ලද ක්රමය මඟින් මෙවැනි ශ්රිතයකට නම් කරන ලද පරාමිතීන් නිර්වචනය කිරීමට ඉඩ ලබා දේ:
function example { args : string firstName , string lastName , integer age } {
echo "My name is ${firstName} ${lastName} and I am ${age} years old."
}
ඔබට තර්ක විතර්ක කළ හැකි හෝ @ කියවිය හැකි ලෙස විවරණය කළ හැකිය, ඉතිරි තර්ක සාදන්න, අනුක්රමික තර්ක වලින් අරා සාදන්න (උදා string[4]
.
function example {
args
: @required string firstName
: string lastName
: integer age
: string[] ...favoriteHobbies
echo "My name is ${firstName} ${lastName} and I am ${age} years old."
echo "My favorite hobbies include: ${favoriteHobbies[*]}"
}
වෙනත් වචන වලින් කිවහොත්, ඔබට ඔබේ පරාමිතීන් ඔවුන්ගේ නම් වලින් ඇමතිය හැකිවා පමණක් නොව (එය වඩාත් කියවිය හැකි හරයක් සෑදී ඇත), ඔබට සැබවින්ම අරා පසු කළ හැකිය (සහ විචල්යයන් සඳහා යොමු කිරීම් - මෙම අංගය ක්රියාත්මක වන්නේ 4.3 හි පමණක් වුවද)! ප්ලස්, සිතියම්ගත කළ විචල්යයන් සියල්ලම ඩොලර් 1 (සහ වෙනත්) මෙන් දේශීය විෂය පථයේ ඇත.
මෙම කාර්යය කරන කේතය ඉතා සැහැල්ලු වන අතර එය bash 3 සහ bash 4 යන දෙකින්ම ක්රියා කරයි (මේවා මා විසින් අත්හදා බැලූ එකම අනුවාදයන් වේ). ඔබ මේ වගේ තවත් උපක්රම ගැන උනන්දුවක් දක්වන්නේ නම් එය වඩාත් හොඳ සහ පහසු කරවයි, ඔබට මගේ Bash Infinity Framework දෙස බැලිය හැකිය , පහත කේතය එහි ක්රියාකාරීත්වයන්ගෙන් එකක් ලෙස ලබා ගත හැකිය.
shopt -s expand_aliases
function assignTrap {
local evalString
local -i paramIndex=${__paramIndex-0}
local initialCommand="${1-}"
if [[ "$initialCommand" != ":" ]]
then
echo "trap - DEBUG; eval \"${__previousTrap}\"; unset __previousTrap; unset __paramIndex;"
return
fi
while [[ "${1-}" == "," || "${1-}" == "${initialCommand}" ]] || [[ "${#@}" -gt 0 && "$paramIndex" -eq 0 ]]
do
shift # first colon ":" or next parameter's comma ","
paramIndex+=1
local -a decorators=()
while [[ "${1-}" == "@"* ]]
do
decorators+=( "$1" )
shift
done
local declaration=
local wrapLeft='"'
local wrapRight='"'
local nextType="$1"
local length=1
case ${nextType} in
string | boolean) declaration="local " ;;
integer) declaration="local -i" ;;
reference) declaration="local -n" ;;
arrayDeclaration) declaration="local -a"; wrapLeft= ; wrapRight= ;;
assocDeclaration) declaration="local -A"; wrapLeft= ; wrapRight= ;;
"string["*"]") declaration="local -a"; length="${nextType//[a-z\[\]]}" ;;
"integer["*"]") declaration="local -ai"; length="${nextType//[a-z\[\]]}" ;;
esac
if [[ "${declaration}" != "" ]]
then
shift
local nextName="$1"
for decorator in "${decorators[@]}"
do
case ${decorator} in
@readonly) declaration+="r" ;;
@required) evalString+="[[ ! -z \$${paramIndex} ]] || echo \"Parameter '$nextName' ($nextType) is marked as required by '${FUNCNAME[1]}' function.\"; " >&2 ;;
@global) declaration+="g" ;;
esac
done
local paramRange="$paramIndex"
if [[ -z "$length" ]]
then
# ...rest
paramRange="{@:$paramIndex}"
# trim leading ...
nextName="${nextName//\./}"
if [[ "${#@}" -gt 1 ]]
then
echo "Unexpected arguments after a rest array ($nextName) in '${FUNCNAME[1]}' function." >&2
fi
elif [[ "$length" -gt 1 ]]
then
paramRange="{@:$paramIndex:$length}"
paramIndex+=$((length - 1))
fi
evalString+="${declaration} ${nextName}=${wrapLeft}\$${paramRange}${wrapRight}; "
# continue to the next param:
shift
fi
done
echo "${evalString} local -i __paramIndex=${paramIndex};"
}
alias args='local __previousTrap=$(trap -p DEBUG); trap "eval \"\$(assignTrap \$BASH_COMMAND)\";" DEBUG;'