ЁЯП╖я╕П рдзрдбрд╛ 05 тАФ Variables рдЖрдгрд┐ quoting: name tags
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдкреБрдвреЗ: lesson-06-conditions-loops
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ05. рдЧреЛрд╖реНрдЯреАрдВрдирд╛ рдирд╛рд╡ рджреЗрдгреЗ, рддреЗ рдкрд░рдд рд╡рд╛рдЪрдгреЗ, рдЖрдгрд┐ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ scripts рдирд╛ рдзреЛрдХрд╛рджрд╛рдпрдХ scripts рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгрд╛рд░рд╛ quoting рдЪрд╛ рдирд┐рдпрдо.
- bin/school.sh тАФ
REGISTER="${SCHOOL_REGISTER:-тАж}",${1:?enrol needs NAME}, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ"$name"quotes рдордзреНрдпреЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
variable рдореНрд╣рдгрдЬреЗ рдПрдХрд╛ value рд╡рд░рдЪрд╛ name tag: REGISTER=data/register.csv.
$REGISTER рдореНрд╣рдЯрд▓реЗ рдХреА рдХреЗрдЕрд░рдЯреЗрдХрд░ tag рд╡рд╛рдЪрддреЛ. рдкрдг рдХреЗрдЕрд░рдЯреЗрдХрд░ рд╢рдмреНрджрд╢рдГ рдРрдХрддреЛ: value рдордзреНрдпреЗ
space рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреБрдореНрд╣реА рддрд┐рдЪреНрдпрд╛рднреЛрд╡рддреА quotes рдШрд╛рддрд▓реЗ рдирд╕рддреАрд▓, рддрд░ рддреНрдпрд╛рд▓рд╛ рджреЛрди рд╢рдмреНрдж
рдРрдХреВ рдпреЗрддрд╛рдд. "$name" рдиреЗрд╣рдореА рдПрдХрдЪ рдЧреЛрд╖реНрдЯ рдЕрд╕рддреЗ. $name рдореНрд╣рдгрдЬреЗ "spaces рд╡рд░ рддреЛрдбрд╛ рдЖрдгрд┐
рдХреЛрдгрддрд╛рд╣реА * expand рдХрд░рд╛". рдпрд╛ рдлрд░рдХрд╛рдиреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА virus рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд files delete рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
A["name='My Report'"] --> B["rm \"$name\" тЖТ rm 'My Report' (1 argument)"]
A --> C["rm $name тЖТ rm My Report (2 arguments, both wrong)"]
тЭУ рдХрд╛рдп
- spaces рд╢рд┐рд╡рд╛рдп assign рдХрд░рд╛:
X=value. рд╡рд╛рдЪрд╛:$XрдХрд┐рдВрд╡рд╛${X}.export XрддреЛ child processes рдирд╛ рджрд┐рд╕реВ рджреЗрддреЛ (environment); рд╕рд╛рдзреЗ variables рдпрд╛рдЪ shell рдордзреНрдпреЗ рд░рд╛рд╣рддрд╛рдд. "$X"рддреЛ рдЕрдЦрдВрдб рдареЗрд╡рддреЛ.'$X'рдореНрд╣рдгрдЬреЗ рдЬрд╕рд╛рдЪреНрдпрд╛ рддрд╕рд╛ text. unquoted$XрддреБрдЯрддреЛ рдЖрдгрд┐ glob рд╣реЛрддреЛ.- Defaults рдЖрдгрд┐ рдкрд╣рд╛рд░реЗ:
${X:-default}┬╖${X:?message}(unset рдЕрд╕реЗрд▓ рддрд░ exit) ┬╖${X:=default}(рддреЛ set рд╕реБрджреНрдзрд╛ рдХрд░рддреЛ). $(cmd)output рдкрдХрдбрддреЛ ┬╖$((a + b))рдЧрдгрд┐рдд ┬╖$#рд╕рдВрдЦреНрдпрд╛ ┬╖$@рд╕рдЧрд│реЗ arguments ┬╖$?рд╢реЗрд╡рдЯрдЪрд╛ exit code ┬╖$$рд╣рд╛ PID ┬╖$0script.${X//a/b}рдмрджрд▓рд╛ ┬╖${X%.csv}рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ рдХрд╛рдврд╛ ┬╖${#X}рд▓рд╛рдВрдмреА.
ЁЯдФ рдХрд╛
DIR unset рдЕрд╕рддрд╛рдирд╛ rm -rf $DIR/ expand рд╣реЛрдКрди rm -rf / рд╣реЛрддреЛ. ${DIR:?} рдЪрд╛рд▓рд╛рдпрд▓рд╛
рдирдХрд╛рд░ рджреЗрддреЛ; "$DIR" space рдЕрд╕рд▓реЗрд▓рд╛ path рдЕрдЦрдВрдб рдареЗрд╡рддреЛ; set -u (рдзрдбрд╛ 08)
typo рдкрдХрдбрддреЛ. Quoting рд╣реА рд╢реИрд▓реА рдирд╛рд╣реА; рддреА рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
school.sh рдордзрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ variable quoted рдЖрд╣реЗ. REGISTER рд▓рд╛ рдПрдХ default рдЖрд╣реЗ рдЬреЛ
environment рдмрджрд▓реВ рд╢рдХрддреЗ; enrol ${1:?тАж} рдиреЗ рдЖрдкрд▓реЗ arguments рдорд╛рдЧрддреЛ;
valid_class [[ " $CLASSES " == *" $1 "* ]] рдиреЗ рд╕рджрд╕реНрдпрддреНрд╡ рддрдкрд╛рд╕рддреЛ тАФ quotes рдЪреНрдпрд╛ рдЖрддрд▓реНрдпрд╛
spaces рдореБрджреНрджрд╛рдо рдареЗрд╡рд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
name="Zoya Khan"; printf '[%s]\n' $name; printf '[%s]\n' "$name" # 2 arguments vs 1
SCHOOL_REGISTER=/tmp/reg.csv bin/school.sh list; echo "exit $?" # the default, overridden тАФ and missing
cp data/register.csv /tmp/reg.csv && SCHOOL_REGISTER=/tmp/reg.csv bin/school.sh list --class 3B
bin/school.sh enrol; echo "exit $?" # ${1:?} refuses
n=$(bin/school.sh list 2>/dev/null | tail -n +2 | wc -l); echo "students: $((n))"
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
[Zoya] [Khan] рдЖрдгрд┐ рдордЧ [Zoya Khan]; рдирд╕рд▓реЗрд▓реА рдиреЛрдВрджрд╡рд╣реА рд╕реНрдкрд╖реНрдЯ message рд╕рд╣ 1 рдиреЗ exit
рд╣реЛрддреЗ; copy рдХреЗрд▓реЗрд▓реА рдиреЛрдВрджрд╡рд╣реА 3B рджрд╛рдЦрд╡рддреЗ; arguments рд╢рд┐рд╡рд╛рдп enrol enrol needs NAME рдЫрд╛рдкрддреЛ
рдЖрдгрд┐ 1 рдиреЗ exit рд╣реЛрддреЛ; students: 5.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА value рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рд╡рд╛рдЪреВ рд╢рдХрддрд╛, рддрд┐рд▓рд╛ default рджреЗрдК рд╢рдХрддрд╛, рддреА рдорд╛рдЧреВ рд╢рдХрддрд╛, рдЖрдгрд┐ рдПрдХрд╛ рдареЛрд╕ input рдиреЗ quotes рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рд╣реЗ рд╕рдордЬрд╛рд╡реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
X = value(spaces):Xрдирд╛рд╡рд╛рдЪрд╛ command рдЪрд╛рд▓рд╡рддреЛ.for f in $(ls): spaces рд╡рд░ рддреБрдЯрддреЛ.for f in *рд╡рд╛рдкрд░рд╛.exportрдордзрд▓реА secrets рдЬреА рдкреНрд░рддреНрдпреЗрдХ child process тАФ рдЖрдгрд┐ps eтАФ рдкрд╛рд╣реВ рд╢рдХрддреЛ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: deploy script рдордзрд▓реНрдпрд╛ space рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛ unquoted path рдиреЗ рдПрдХрджрд╛ Steam for Linux рд╡рд░
/usrрдкреБрд╕реВрди рдЯрд╛рдХрд▓реЗ. рдЙрдкрд╛рдп рд╣реЛрддрд╛ quotes рдЪреА рдПрдХ рдЬреЛрдбреА рдЖрдгрд┐${VAR:?}.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 06 тАФ conditions рдЖрдгрд┐ loops: рдХреЗрдЕрд░рдЯреЗрдХрд░ exit codes рд╡рд░реВрди рдирд┐рд░реНрдгрдп рдШреЗрддреЛ.