Google рдХреА рд╢реИрд▓ рд╢реИрд▓реА рдЧрд╛рдЗрдб (рд░реВрд╕реА рдореЗрдВ)

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдХрд┐рд╕ рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ


Bash рдПрдХрдорд╛рддреНрд░ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЭрдВрдбреЗ рдХреЗ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХреЗ рд╕рд╛рде #!/bin/bash рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реЗрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реЗрдЯ set рд▓рд┐рдП рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ bash <script_name> рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рди рд╣реЛред


рдмреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╢реЗрд▓ рднрд╛рд╖рд╛ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рднреА рдорд╢реАрдиреЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреА рд╣реИред


рдПрдХрдорд╛рддреНрд░ рдЕрдкрд╡рд╛рдж рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЙрди рд╢рд░реНрддреЛрдВ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЛрд▓рд╛рд░рд┐рд╕ рдПрд╕рд╡реАрдЖрд░ 4 рдкреИрдХреЗрдЬ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдмреЙрд░реНрди рд╢реЗрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╢реИрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░рдирд╛ рд╣реИ


рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЫреЛрдЯреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдпрд╛ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдПрдХ рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реЗ Google рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╢реИрд▓реА рдЧрд╛рдЗрдб рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдзрд┐рдХ рдорд╛рдиреНрдпрддрд╛ рд╣реИред


рдХреБрдЫ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ:


  • рдпрджрд┐ рдЖрдк рдЕрдХреНрд╕рд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдбреЗрдЯрд╛ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реЗрд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред
  • рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рд╢реЗрд▓ рдирд╣реАрдВред
  • рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ ${PIPESTATUS} рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ 100 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдврд╝ рд░рд╣реА рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдкреБрдирд░реНрд▓реЗрдЦрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВред

рд╢реЗрд▓ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЙрд▓


рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди


рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд╕рдВрджреАрджрд╛) рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПредред рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╢реЗрд▓ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд▓рдХреНрд╖реНрдпреЛрдВ рд╡рд╛рд▓реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрд┐рдд рдирд╛рдо рдПрдХ рднрд╛рд╖рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддреНрдпрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


SUID / SGID


рдПрд╕рдпреВрдЖрдИрдбреА рдФрд░ рдПрд╕рдЬреАрдЖрдИрдбреА тАЛтАЛрд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВред


рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд SUID / SGID рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ bash SUID рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрдврд╝реА рд╣реБрдИ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП sudo рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдкрд░реНрдпрд╛рд╡рд░рдг


рдПрд╕рдЯреАрдбреАрдЖрд░ рдмрдирд╛рдо рдПрд╕рдЯреАрдбреАрдЖрд░


рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ STDERR рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред


рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред


рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред


 err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $@" >&2 } if ! do_something; then err "Unable to do_something" exit "${E_DID_NOTHING}" fi 

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░


рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред


рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдПрдХ рд╢реАрд░реНрд╖рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдХреЙрдкреАрд░рд╛рдЗрдЯ рд╕реВрдЪрдирд╛ рдФрд░ рд▓реЗрдЦрдХ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 #!/bin/bash # # Perform hot backups of Oracle databases. 

рдлрд╝реАрдЪрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдЙрд╕рдХреА рд▓рдВрдмрд╛рдИ рдпрд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред


рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ (рдФрд░ рдЖрддреНрдо-рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛) рдХреЛ рдкрдврд╝рдХрд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╛ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред


рд╕рднреА рдлрд╝реАрдЪрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


  • рд╕рдорд╛рд░реЛрд╣ рд╡рд┐рд╡рд░рдг
  • рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд
  • рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП
  • рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдВ рдЬреЛ рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рдореЗрдВ рдорд╛рдирдХ рдирд┐рдХрд╛рд╕ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 #!/bin/bash # # Perform hot backups of Oracle databases. export PATH='/usr/xpg4/bin:/usr/bin:/opt/csw/bin:/opt/goog/bin' ######################################## # Cleanup files from the backup dir # Globals: # BACKUP_DIR # ORACLE_SID # Arguments: # None # Returns: # None ######################################## cleanup() { ... } 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдЬрдЯрд┐рд▓, рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ, рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред


рдпрд╣ Google рдкрд░ рдХреЛрдб рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдмрд╛рдд рдкрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрдИ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдпрд╛ рдЖрдк рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЫреЛрдЯреА рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВред


TODO рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдХреЛрдб рдХреЗ рд▓рд┐рдП TODO рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЕрд╕реНрдерд╛рдпреА, рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдпрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдирд╣реАрдВ рд╣реИред


рдпрд╣ C ++ рдореИрдиреБрдЕрд▓ рдореЗрдВ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред


TODO рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ TODO рд╢рдмреНрдж рдХреЛ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЛрд╖реНрдардХ рдореЗрдВ рдЖрдкрдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред рдПрдХ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдЯреАрдУрдбреАрдУ рддрддреНрд╡ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмрдЧ / рдЯрд┐рдХрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 # TODO(mrmonkey): Handle the unlikely edge cases (bug ####) 

рд╕реНрд╡рд░реВрдкрдг


рдпрджреНрдпрдкрд┐ рдЖрдкрдХреЛ рдЙрд╕ рд╢реИрд▓реА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╣реИ, рдХрд┐рд╕реА рднреА рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рдЗрдВрдбреЗрдВрдЯ


рдЗрдВрдбреЗрдВрдЯ 2 рд░рд┐рдХреНрдд рд╕реНрдерд╛рдиред рдХреЛрдИ рдЯреИрдм рдирд╣реАрдВред


рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреЗ рдмреАрдЪ рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рджреЛ рдЬрдЧрд╣ рд╣реИред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЯреИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдореМрдЬреВрджрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд░рд╣реЗрдВред


рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ рдФрд░ рдореВрд▓реНрдп рд▓рдВрдмрд╛рдИ


рдЕрдзрд┐рдХрддрдо рдкрдВрдХреНрддрд┐ рдХреА рд▓рдВрдмрд╛рдИ 80 рд╡рд░реНрдг рд╣реИред


рдпрджрд┐ рдЖрдкрдХреЛ 80 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ here document рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд newline ред рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп рдЬреЛ 80 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдпрдереЛрдЪрд┐рдд рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрдорддрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬреЗрдВред


 #  'here document's cat <<END; I am an exceptionally long string. END #  newlines   long_string="I am an exceptionally long string." 

рдкрд╛рдЗрдкрд▓рд╛рдЗрди


рдпрджрд┐ рд╡реЗ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрджрд┐ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдПрдХ рдирдИ рд▓рд╛рдЗрди рдкрд░ рд╣реЛ рдФрд░ рдЕрдЧрд▓реЗ рдЦрдВрдб рдХреЗ рд▓рд┐рдП 2 рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рджреНрд╡рд╛рд░рд╛ рдЗрдВрдбреЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ 'рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдВрдпреБрдХреНрдд рдХрдорд╛рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред' рд╕рд╛рде рд╣реА '' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рддрд╛рд░реНрдХрд┐рдХ рдХрдиреЗрдХреНрд╢рди || рдФрд░ '&&'ред


 #      command1 | command2 #   command1 \ | command2 \ | command3 \ | command4 

рдЪрдХреНрд░


рдЬрдЧрд╣ ; do ; do рдФрд░ ; then ; then рдЙрд╕реА рд▓рд╛рдЗрди рдкрд░, while рдпрд╛ рдЙрд╕рдХреЗ for ред


рд╢реЗрд▓ рдореЗрдВ рдЪрдХреНрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рд╣реИ ; then ; then рдФрд░ ; do рдПрдХ рд╣реА рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ if / рдХреЗ for / while ред else рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреНрд▓реЛрдЬрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╢реБрд░реБрдЖрддреА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд▓рдВрдмрд╡рдд рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 for dir in ${dirs_to_cleanup}; do if [[ -d "${dir}/${ORACLE_SID}" ]]; then log_date "Cleaning up old files in ${dir}/${ORACLE_SID}" rm "${dir}/${ORACLE_SID}/"* if [[ "$?" -ne 0 ]]; then error_message fi else mkdir -p "${dir}/${ORACLE_SID}" if [[ "$?" -ne 0 ]]; then error_message fi fi done 

рдХреЗрд╕ рдХрд╛ рдмрдпрд╛рди


  • 2 рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкред
  • рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмрд╛рдж рдФрд░ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ;; ред
  • рд▓рдВрдмреЗ рдпрд╛ рдмрд╣реБ-рдХрдорд╛рдВрдб рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ, рдХрд╛рд░реНрдпреЛрдВ рдФрд░ ;; рд╕рд╛рде рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ;; рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ред

рдкрддреНрд░рд╛рдЪрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ case рдФрд░ esac рд╕реЗ рдПрдХ рд╕реНрддрд░ рдХрд╛ esac ред рдмрд╣реБрд╕реНрддрд░реАрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрддрд░ рдкрд░ рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВред рднрд╛рд╡реЛрдВ рдореЗрдВ рднрд╛рд╡ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреИрдЯрд░реНрди рдЦреБрд▓реЗ рдХреЛрд╖реНрдардХ рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ &; рдФрд░ ;;& рд╕рдВрдХреЗрддрди


 case "${expression}" in a) variable="..." some_command "${variable}" "${other_expr}" ... ;; absolute) actions="relative" another_command "${actions}" "${other_expr}" ... ;; *) error "Unexpected expression '${expression}'" ;; esac 

рд╕рд░рд▓ рдХрдорд╛рдВрдб рдХреЛ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ ;; рдЬрдмрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрдардиреАрдп рд╣реИред рдпрд╣ рдЕрдХреНрд╕рд░ рдПрдХрд▓-рдкрддреНрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЬрдм рдХреНрд░рд┐рдпрд╛рдПрдВ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЕрдкрдиреА рд▓рд╛рдЗрди рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЫреЛрдбрд╝ рджреЗрдВ, рдЕрдЧрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ, рдлрд┐рд░ ;; рдЦреБрдж рдХреА рд▓рд╛рдЗрди рдореЗрдВ рднреАред рдЬрдм рдпрд╣ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реЗрдЦрд╛ рд╣реЛ, рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдорд╛рдкрди рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рдж рдФрд░ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;; ред


 verbose='false' aflag='' bflag='' files='' while getopts 'abf:v' flag; do case "${flag}" in a) aflag='true' ;; b) bflag='true' ;; f) files="${OPTARG}" ;; v) verbose='true' ;; *) error "Unexpected option ${flag}" ;; esac done 

рдЪрд░ рд╡рд┐рд╕реНрддрд╛рд░


рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ: рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ; рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдЪрд░; "${var}" "$var" рд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЖрдБрдЦ рдХреЗ рд╕рд╛рдеред


рдпреЗ рдмрд▓реНрдХрд┐ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╖рдп рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рдирд┐рдпрдорди рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред рд╡реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВред


  1. рдЙрд╕реА рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рдорд┐рд▓рддреА рд╣реИред
  2. рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рдЪрд░ рдбрд╛рд▓реЗрдВ, рдиреАрдЪреЗ рдХреЛрдЯреЗрд╢рди рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред
  3. рдЬрдм рддрдХ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ рдФрд░ рдЧрд╣рд░реЗ рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╢реЗрд▓ / рдкреЛрдЬрд┐рд╢рдирд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рди рд░рдЦреЗрдВред
    рдЕрдиреНрдп рд╕рднреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред


      #    #    '' : echo "Positional: $1" "$5" "$3" echo "Specials: !=$!, -=$-, _=$_. ?=$?, #=$# *=$* @=$@ \$=$$ ..." #   : echo "many parameters: ${10}" #    : # Output is "a0b0c0" set -- abc echo "${1}0${2}0${3}0" #     : echo "PATH=${PATH}, PWD=${PWD}, mine=${some_var}" while read f; do echo "file=${f}" done < <(ls -l /tmp) #    #   ,    , #     ,   shell echo a=$avar "b=$bvar" "PID=${$}" "${1}" #  : #    "${1}0${2}0${3}0",   "${10}${20}${30} set -- abc echo "$10$20$30" 

    рдЙрджреНрдзрд░рдг


    • рд╣рдореЗрд╢рд╛ рдЙрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рдЪрд░, рдХрдорд╛рдВрдб рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдпрд╛ рд╢реЗрд▓ рдореЗрдЯрд╛рдЪреИрдХрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
    • рдЙрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдЬреЛ "рд╢рдмреНрдж" рд╣реИрдВ (рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдкрде рдирд╛рдореЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд)
    • рдХрднреА рднреА рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рдЙрджреНрдзрд░рдг рди рджреЗрдВред
    • рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рдореИрдЪ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ [[ ред
    • "$@" рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ $* рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред


 # ''  ,     . # ""  ,   /. #   # "   " flag="$(some_command and its args "$@" 'quoted separately')" # "  " echo "${flag}" # "      " value=32 # "    ",      number="$(generate_number)" # "   ",    readonly USE_INTEGER='true' # "    - shell" echo 'Hello stranger, and well met. Earn lots of $$$' echo "Process $$: Done making \$\$\$." # "    " # ( ,  $1  ) grep -li Hugo /dev/null "$1" #    # "   ,    ": ccs     git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"} #   : $1    #       . grep -cP '([Ss]pecial|\|?characters*)$' ${1:+"$1"} #   , # "$@"   ,  # $*    # # * $*  $@   ,   #      ; # * "$@"     ,   #       ; #     ,      #   # * "$*"    ,    #     () , #        # ( 'man bash'  nit-grits ;-) set -- 1 "2 two" "3 three tres"; echo $# ; set -- "$*"; echo "$#, $@") set -- 1 "2 two" "3 three tres"; echo $# ; set -- "$@"; echo "$#, $@") 

рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдБ


рдХрдорд╛рди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди


рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп $(command) рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдиреЗрд╕реНрдЯреЗрдб рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреЛ \ _ рдХреЗ рд╕рд╛рде рдЖрдВрддрд░рд┐рдХ рдЙрджреНрдзрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред $ (command) рдкреНрд░рд╛рд░реВрдк рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 #  : var="$(command "$(command1)")" #  : var="`command \`command1\``" 

рдЬрд╛рдБрдЪ, [ рдФрд░ [[


[[ ... ]] test , рдпрд╛ /usr/bin/[ рддреБрд▓рдирд╛ [[ ... ]] рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИред


[[ ... ]] рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ [[ рдФрд░ ]] , рдФрд░ [[ ... ]] рдмреАрдЪ рдХреЛрдИ рдкрде рд╕рдВрдХрд▓реНрдк рдпрд╛ рд╢рдмреНрдж рдкреГрдердХреНрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ [ ... ] рдирд╣реАрдВ рд╣реИред


 #  ,       #  `alnum`,     . #  ,       #  .  ,  # E14   https://tiswww.case.edu/php/chet/bash/FAQ if [[ "filename" =~ ^[[:alnum:]]+name ]]; then echo "Match" fi #     "f*" (    ) if [[ "filename" == "f*" ]]; then echo "Match" fi #    "too many arguments",   f*   #     if [ "filename" == f* ]; then echo "Match" fi 

рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдмреИрд╢ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдЦрд╛рд▓реА / рдЧреИрд░-рд░рд┐рдХреНрдд рдорд╛рди рдпрд╛ рдЦрд╛рд▓реА рдорд╛рди рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


 #  : if [[ "${my_var}" = "some_string" ]]; then do_something fi # -z (   ),  -n (    ): #      if [[ -z "${my_var}" ]]; then do_something fi #   ( ),   : if [[ "${my_var}" = "" ]]; then do_something fi #   : if [[ "${my_var}X" = "some_stringX" ]]; then do_something fi 

рдЖрдк рдЬреЛ рдЬрд╛рдБрдЪ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ -z рдпрд╛ -n рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


 #   if [[ -n "${my_var}" ]]; then do_something fi #  ,    ,  ${my_var} #     . if [[ "${my_var}" ]]; then do_something fi 

рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рднрд╛рд╡


рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдЪреВрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо - рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ ./* рдмрдЬрд╛рдпред


 #   : # -f -r somedir somefile #        force psa@bilby$ rm -v * removed directory: `somedir' removed `somefile' #   : psa@bilby$ rm -v ./* removed `./-f' removed `./-r' rm: cannot remove `./somedir': Is a directory removed `./somefile' 

eval


eval рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдПрд╡рд▓ рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рдЪрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдЪрд░ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд┐рдирд╛ред


 #   ? #   ?   ? eval $(set_my_variables) #  ,         ? variable="$(eval some_function)" 

рдореЗрдВ рдкрд╛рдЗрдк


рдЖрджреЗрд╢ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпрд╛ рд▓реВрдк рдХреЗ for рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, while рдкрд╛рдЗрдк рдореЗрдВред рдЪрд░ while рдореЗрдВ рдмрджрд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдЕрднрд┐рднрд╛рд╡рдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдлреИрд▓рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓реВрдк рдХрдорд╛рдВрдб рдХреЛ рдПрдХ рдЙрдк-рд╢реЗрд▓ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


while рдкрд╛рдЗрдк рдореЗрдВ рдПрдХ рдирд┐рд╣рд┐рдд рдЙрдк-рд╢реЗрд▓ рддреНрд░реБрдЯрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред


 last_line='NULL' your_command | while read line; do last_line="${line}" done #   'NULL' echo "${last_line}" 

рдПрдХ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ)ред


 total=0 #  ,       . for value in $(command); do total+="${value}" done 

рдХрдорд╛рдВрдб рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдк-рд╢реЗрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрдк-рд╢реЗрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ while рд▓рд┐рдП рдмреИрд╢ рдмрдирд╛рддрд╛ рд╣реИред


 total=0 last_file= while read count filename; do total+="${count}" last_file="${filename}" done < <(your_command | uniq -c) #         # . echo "Total = ${total}" echo "Last one = ${last_file}" 

рдРрд╕реЗ рдЫреЛрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдореВрд▓ рд╢реЗрд▓ рдореЗрдВ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рддрдм рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬрдм рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ "рдкрд╛рд░реНрд╕рд┐рдВрдЧ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрднреА-рдХрднреА рдЬрд╛рдЧ рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рддрдм рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


 #    awk: # awk '$3 == "nfs" { print $2 " maps to " $1 }' /proc/mounts cat /proc/mounts | while read src dest type opts rest; do if [[ ${type} == "nfs" ]]; then echo "NFS ${dest} maps to ${src}" fi done 

рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди


рдХрд╛рд░реНрдп рдХрд╛ рдирд╛рдо


рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде рдирд┐рдЪрд▓рд╛ рдорд╛рдорд▓рд╛ред рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде :: ред рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рдмрд╛рдж рдмреНрд░реИрдХреЗрдЯ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреАрд╡рд░реНрдб рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред


рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд▓реЛрдЕрд░рдХреЗрд╕ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдкреИрдХреЗрдЬ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ :: рдЕрд▓рдЧ рдХрд░реЗрдВред рдмреНрд░реИрдХреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо (Google рдкрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣) рдХреЗ рд╕рдорд╛рди рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


 #   my_func() { ... } #   mypackage::my_func() { ... } 

рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рдмрд╛рдж "()" рдЖрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреАрд╡рд░реНрдб рдЕрдирд╛рд╡рд╢реНрдпрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреА рддреНрд╡рд░рд┐рдд рдкрд╣рдЪрд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред


рдЪрд░ рдирд╛рдо


рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред


рд▓реВрдк рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╛рдо рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред


 for zone in ${zones}; do something_with "${zone}" done 

рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдирд┐рд░рдВрддрд░ рдирд╛рдо


рд╕рднреА рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП, рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рд╕рдм рдХреБрдЫ рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


 #  readonly PATH_TO_FILES='/some/path' # ,   declare -xr ORACLE_SID='PROD' 

рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╕реНрдерд┐рд░ рд░рд╣рддреА рд╣реИрдВ рдЬрдм рд╡реЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, getopts рдорд╛рдзреНрдпрдо рд╕реЗ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, getopts рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдПрдХ рд╢рд░реНрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдареАрдХ рдмрд╛рдж рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ declare рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╛ export рд╕рд┐рдлрд╛рд░рд┐рд╢ export рдЬрд╛рддреА рд╣реИред


 VERBOSE='false' while getopts 'v' flag; do case "${flag}" in v) VERBOSE='true' ;; esac done readonly VERBOSE 

рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдирд╛рдо


рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рдеред


рдпрд╣ Google рдкрд░ рдХреЛрдб рдХреА рдЕрдиреНрдп рд╢реИрд▓рд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ: maketemplate рдпрд╛ make_template , рд▓реЗрдХрд┐рди make-template ред


рдХреЗрд╡рд▓ рдЪрд░ рдкрдврд╝реЗрдВ


рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝реЗрдВ рдпрд╛ declare -r рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


shell, . , , .


 zip_version="$(dpkg --status zip | grep Version: | cut -d ' ' -f 2)" if [[ -z "${zip_version}" ]]; then error_message else readonly zip_version fi 


, , local . .


, , local . , .


, ; local exit code .


 my_func2() { local name="$1" #      : local my_var my_var="$(my_func)" || return #   : $?  exit code  'local',   my_func local my_var="$(my_func)" [[ $? -eq 0 ]] || return ... } 


. .


, . , set , .


. .


main


, main , , .


, main . , ( , ). main:


 main "$@" 

, , , main тАФ , .




.


$? if , .


:


 if ! mv "${file_list}" "${dest_dir}/" ; then echo "Unable to move ${file_list} to ${dest_dir}" >&2 exit "${E_BAD_MOVE}" fi #  mv "${file_list}" "${dest_dir}/" if [[ "$?" -ne 0 ]]; then echo "Unable to move ${file_list} to ${dest_dir}" >&2 exit "${E_BAD_MOVE}" fi Bash    `PIPESTATUS`,         .           ,   : ```bash tar -cf - ./* | ( cd "${dir}" && tar -xf - ) if [[ "${PIPESTATUS[0]}" -ne 0 || "${PIPESTATUS[1]}" -ne 0 ]]; then echo "Unable to tar files to ${dir}" >&2 fi 

, PIPESTATUS , - , , PIPESTATUS ( , [ PIPESTATUS ).


 tar -cf - ./* | ( cd "${DIR}" && tar -xf - ) return_codes=(${PIPESTATUS[*]}) if [[ "${return_codes[0]}" -ne 0 ]]; then do_something fi if [[ "${return_codes[1]}" -ne 0 ]]; then do_something_else fi 


shell , .


, bash, ( , sed ).


:


 #  : addition=$((${X} + ${Y})) substitution="${string/#foo/bar}" #  : addition="$(expr ${X} + ${Y})" substitution="$(echo "${string}" | sed -e 's/^foo/bar/')" 

рдирд┐рд╖реНрдХрд░реНрд╖


.


рдХреГрдкрдпрд╛ C ++ рдореИрдиреБрдЕрд▓ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд╛рд░реНрдЯрд┐рдВрдЧ рд╡рд░реНрдбреНрд╕ рд╕реЗрдХреНрд╢рди рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд┐рдирдЯ рд▓реЗрдВ ред

Source: https://habr.com/ru/post/hi413155/


All Articles