ЁЯзй рдзрдбрд╛ 07 тАФ Functions рдЖрдгрд┐ arguments: рджрд┐рдирдЪрд░реНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдкреБрдвреЗ: lesson-08-errors-safety
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07. рдПрдХрд╛ рджрд┐рдирдЪрд░реНрдпреЗрд▓рд╛ рдирд╛рд╡ рджреЗрдгреЗ, рддрд┐рд▓рд╛ arguments рджреЗрдгреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦрд▒реНрдпрд╛ script рдордзреНрдпреЗ рдЕрд╕рдгрд╛рд░рд╛ рд╕рд╛рдВрдЧрд╛рдбрд╛.
- bin/school.sh тАФ рдкрд╛рдЪ
cmd_*functions,usage(),main "$@" - lib/log.sh тАФ
log,die,need:sourceрджреНрд╡рд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ script рд╡рд╛рдкрд░рддреЗ рдЕрд╢реА рддреАрди functions
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд░реЛрдЬ рд╕рдХрд╛рд│реА рдХреЗрдЕрд░рдЯреЗрдХрд░рд▓рд╛ рддреНрдпрд╛рдЪ рд╕рд╛рдд рдУрд│реА рд╕рд╛рдВрдЧрдгреНрдпрд╛рдРрд╡рдЬреА, рддреБрдореНрд╣реА рддреНрдпрд╛ рдПрдХрд╛ рдирд╛рд╡ рджрд┐рд▓реЗрд▓реНрдпрд╛
рдХрд╛рд░реНрдбрд╡рд░ рд▓рд┐рд╣рд┐рддрд╛ тАФ рдПрдХ function тАФ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реА рдорд╛рд╣рд┐рддреА рджреЗрддрд╛:
cmd_enrol Zoya 3B A. рдЖрдд, $1 рдореНрд╣рдгрдЬреЗ рдкрд╣рд┐рд▓реА рдорд╛рд╣рд┐рддреА, $2 рджреБрд╕рд░реА,
"$@" рд╕рдЧрд│реА. script рдЪреА рд╢реЗрд╡рдЯрдЪреА рдУрд│, main "$@", рддреБрдореНрд╣реА рдЯрд╛рдЗрдк рдХреЗрд▓реЗрд▓реЗ рд╕рдЧрд│реЗ рдПрдХрд╛
рджрд┐рдирдЪрд░реНрдпреЗрдХрдбреЗ рджреЗрддреЗ, рдЬреА рдХреЛрдгрддреЗ рдХрд╛рд░реНрдб рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рддреЗ рдард░рд╡рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TD
M["main \"$@\""] --> C{"case $cmd"}
C -->|list| L["cmd_list --class 3A"]
C -->|enrol| E["cmd_enrol NAME CLASS [GRADE]"]
C -->|report| R["cmd_report"]
C -->|"*"| U["die 'unknown command'"]
тЭУ рдХрд╛рдп
name() { тАж; }define рдХрд░рддреЗ;name a bрдмреЛрд▓рд╛рд╡рддреЗ.local xvariable рдЖрддрдЪ рдареЗрд╡рддреЛ.return Nexit code рдард░рд╡рддреЛ; value рдкрд░рдд рджреНрдпрд╛рдпрдЪреА рдЕрд╕реЗрд▓ рддрд░ рддреАechoрдХрд░рд╛ рдЖрдгрд┐$(name)рдиреЗ рдкрдХрдбрд╛.$1 тАж $9,${10},$#рд╕рдВрдЦреНрдпрд╛,"$@"рдкреНрд░рддреНрдпреЗрдХ argument рдЕрдЦрдВрдб,shiftрдкрд╣рд┐рд▓рд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ.${1:?needs NAME}рдПрдХ argument рдорд╛рдЧрддреЛ.- Flags:
while [[ $# -gt 0 ]]; do case "$1" in --class) class="$2"; shift 2;; тАж; esac; done, рдХрд┐рдВрд╡рд╛-a value -b -hрд╕рд╛рдареАgetopts "a:bh" opt. source lib/log.sh(рдХрд┐рдВрд╡рд╛. lib/log.sh) functions рдпрд╛ shell рдордзреНрдпреЗ load рдХрд░рддреЛ.- рд╕рд╛рдВрдЧрд╛рдбрд╛: shebang ┬╖
set -euo pipefail┬╖HERE┬╖source┬╖ functions ┬╖main "$@". usage()sed -n '2,9p' "$0"рдиреЗ header comment рдЫрд╛рдкрддреЗ тАФ--helpрд╕рд╛рдареА рд╕рддреНрдпрд╛рдЪрд╛ рдПрдХрдЪ рд╕реНрд░реЛрдд.
ЁЯдФ рдХрд╛
functions рдореБрд│реЗрдЪ 70 рдУрд│реАрдВрдЪреА script 700 рдУрд│реАрдВрд╡рд░рд╣реА рд╡рд╛рдЪрддрд╛ рдпреЗрддреЗ, рджреЛрди scripts рдПрдХ logger рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд, рдЖрдгрд┐ рддреБрдореНрд╣реА рдПрдЦрд╛рджрд╛ рддреБрдХрдбрд╛ рд╡реЗрдЧрд│рд╛ рдХрд╛рдвреВрди test рдХрд░реВ рд╢рдХрддрд╛ (рдзрдбрд╛ 12).
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
cmd_enrol local рдЖрдгрд┐ ${1:?} рд╡рд╛рдкрд░рддреЛ; cmd_list --class рдЦрд╛рддреЛ; main
shift || true рдиреЗ sub-command рд╕реЛрд▓реВрди рдХрд╛рдврддреЛ рдЖрдгрд┐ case рдиреЗ рдХрд╛рдо рд╡рд╛рдЯрддреЛ;
usage --help рд╕рд╛рдареА 0 рдиреЗ рдЖрдгрд┐ рдЪреБрдХреАрдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА 1 рдиреЗ exit рд╣реЛрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
bin/school.sh --help
bin/school.sh list --class 3B --bogus; echo "exit $?" # the flag loop refuses
source lib/log.sh; log "hello from my shell"; need tar && echo "tar is here"
f() { local x="$1"; echo "got $#: $*"; return 3; }; f a "b c"; echo "exit $?"
# add a sub-command: copy cmd_report, name it cmd_count, print $(tail -n +2 "$REGISTER" | wc -l), wire it into main's case
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
header comment рдордзрд▓рд╛ help text; unknown flag --bogus рдЖрдгрд┐ exit 1;
timestamp рдЕрд╕рд▓реЗрд▓рд╛ hello; got 2: a b c рдЖрдгрд┐ рдордЧ exit 3. рддреБрдордЪрд╛ count
sub-command рдЬреЛрдбрд▓реНрдпрд╛рд╡рд░ 5 рдЫрд╛рдкрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдЦрд▒реНрдпрд╛ CLI рдЪрд╛ рд╕рд╛рдВрдЧрд╛рдбрд╛ рд╡рд╛рдЪреВ рдЖрдгрд┐ рд╡рд╛рдврд╡реВ рд╢рдХрддрд╛: functions, arguments, flags, dispatch, help.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
localрд╡рд┐рд╕рд░рдгреЗ: function рдордзрд▓рд╛iрдмреЛрд▓рд╛рд╡рдгрд╛рд▒реНрдпрд╛рдЪрд╛iрдмрд┐рдШрдбрд╡рддреЛ.return "some text": return рдлрдХреНрдд рдЖрдХрдбрд╛ рдШреЗрддреЛ; valuesechoрдХрд░реВрди рдмрд╛рд╣реЗрд░ рджреНрдпрд╛.- unquoted
main $@: spaces рдЕрд╕рд▓реЗрд▓реЗ arguments рддреБрдЯрддрд╛рдд.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдПрдХрд╛ screen рдкреЗрдХреНрд╖рд╛ рдореЛрдареЗ рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ ops tool рдЪрд╛ рд╣рд╛рдЪ рд╕рд╛рдВрдЧрд╛рдбрд╛ рдЕрд╕рддреЛ; рдЬреНрдпрд╛рдВрдЪрд╛ рдирд╕рддреЛ рддреНрдпрд╛ 400 рдУрд│реАрдВрдЪреНрдпрд╛ files рдирд╛ рд╣рд╛рдд рд▓рд╛рд╡рд╛рдпрдЪреА рдХреЛрдгрд╛рдЪреАрдЪ рд╣рд┐рдВрдордд рд╣реЛрдд рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 08 тАФ errors рдЖрдгрд┐ safety: рдЖрдЧреАрдЪреА рддрд╛рд▓реАрдо тАФ рдореЛрдареНрдпрд╛рдиреЗ fail рд╡реНрд╣рд╛, рд╕рд╛рдлрд╕рдлрд╛рдИ рдХрд░рд╛, рдХрд╛рд╣реАрд╣реА рди рдмрджрд▓рддрд╛ рд╕рд░рд╛рд╡ рдХрд░рд╛.