рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реБрд░рдХреНрд╖рд╛
рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ
#!/bin/bash set -o nounset set -o errexit
рдпрд╣ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред
1) рдЕрдШреЛрд╖рд┐рдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕
2) рдЖрджреЗрд╢реЛрдВ рдХреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкреНрддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛
рдпрджрд┐ рдЖрджреЗрд╢ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
if ! <possible failing command> ; then echo "failure ignored" fi
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдЫ рдХрдорд╛рдВрдб рдХреНрд░реИрд╢ рдХреЛрдб рдЬреИрд╕реЗ "mkdir -p" рдФрд░ "rm -f" рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо (рдХрдорд╛рдВрдб 1 | рдХрдорд╛рдВрдб 2 | рдХрдорд╛рдВрдб 3) рдХреА рдХреЙрд▓рд┐рдВрдЧ рдЪреЗрди рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рднреА рд╣реИрдВ, рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
(./failing_command && echo A)
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ '&&' рдЕрдЧрд▓реА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрдЧрд╛, рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП 'http://fvue.nl/wiki/Bash:_Error_handling' рджреЗрдЦреЗрдВ
рдХрд╛рд░реНрдпреЛрдВ
рдмреИрд╢ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рдХрдорд╛рдВрдб рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг 1:
ExtractBashComments() { egrep "^#" } cat myscript.sh | ExtractBashComments | wc
comments=$(ExtractBashComments < myscript.sh)
рдЙрджрд╛рд╣рд░рдг 2:
SumLines() { # iterating over stdin - similar to awk local sum=0 local line=тАЭтАЭ while read line ; do sum=$((${sum} + ${line})) done echo ${sum} } SumLines < data_one_number_per_line.txt
рдЙрджрд╛рд╣рд░рдг 3:
log() { # classic logger local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: " echo "${prefix} $@" >&2 } log "INFO" "a message"
рдЕрдкрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ / рд╕реНрдерд┐рд░рд╛рдВрдХ рдЫреЛрдбрд╝рдХрд░ "рдореБрдЦреНрдп" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рддрд░реНрдХ рд╣реЛрдВрдЧреЗред
рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛
рдмреИрд╢ рдЖрдкрдХреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг:
рд╕реНрдерд╛рдиреАрдп (рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░)
рдЖрд╕рд╛рдиреА рд╕реЗ (рдЪрд░ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЙрд╕реЗ рдкреБрди: рд╕реМрдВрдкрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ)
## DEFAULT_VAL , , '-7' readonly DEFAULT_VAL=${DEFAULT_VAL:-7} myfunc() { # local some_var=${DEFAULT_VAL} ... }
рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдПрдХ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдЪрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
x=5 x=6 readonly x x=7 # failure
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдЪрд░ рдпрд╛ рддреЛ рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ рдпрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ, рдпрд╣ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред
рдмреИрдХрдЯрд┐рдХреНрд╕ `` рдХреЗ рдмрдЬрд╛рдп $ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдмреИрдХ рдХреЛрдЯреНрд╕ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рдлреЛрдВрдЯ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд┐рдВрдЧрд▓ рдХреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
$ () рдирд┐рд░реНрдорд╛рдг рднреА рдЖрдкрдХреЛ рднрд╛рдЧрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд┐рд░рджрд░реНрдж рдХреЗ рдмрд┐рдирд╛ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
# : ABCD echo "A-`echo B-\`echo C-\\\`echo D\\\`\``" echo "A-$(echo B-$(echo C-$(echo D)))"
рд╕рд┐рдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯ [] рдХреЗ рдмрдЬрд╛рдп рдбрдмрд▓ рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯ [[]] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдбрдмрд▓ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдЪрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЕрдирдЬрд╛рдиреЗ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдХрддреЗ рд╣реИрдВ:
$ [ a < b ] -bash: b: No such file or directory $ [[ a < b ]]
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд░рд▓ рд╣реИ:
[ "${name}" \> "a" -o ${name} \< "m" ] [[ "${name}" > "a" && "${name}" < "m" ]]
рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
рдирдП рдСрдкрд░реЗрдЯрд░:
- || рддрд╛рд░реНрдХрд┐рдХ OR - рдХреЗрд╡рд▓ рдбрдмрд▓ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рдеред
- && рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдХреЗрд╡рд▓ рдбрдмрд▓ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рдеред
- < рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреА рддреБрд▓рдирд╛ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛) - рдбрдмрд▓ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдкрд░рд┐рд░рдХреНрд╖рдг рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
- == рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреА рддреБрд▓рдирд╛ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЧреНрд▓реЛрдмрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди) - рдХреЗрд╡рд▓ рдбрдмрд▓ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рдеред
- = ~ рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ (рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдореИрдЪрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рддреБрд▓рдирд╛ - рдХреЗрд╡рд▓ рдбрдмрд▓ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рдеред
рдЕрдиреБрдкреВрд░рдХ / рд╕рдВрд╢реЛрдзрд┐рдд рдкрд░рд┐рдЪрд╛рд▓рдХ:
- -рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддреБрд▓рдирд╛
- -рдПрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдиреЙрди-рдЦрд╛рд▓реА
- -z рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдЦрд╛рд▓реА рд╣реИ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЦрд╛рд▓реА рд╣реИ)
- -рдИрдХреН рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдорд╛рдирддрд╛
- -рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рдЕрд╕рдорд╛рдирддрд╛
рдЙрджрд╛рд╣рд░рдг:
t="abc123" [[ "$t" == abc* ]] # true (globbing) [[ "$t" == "abc*" ]] # false (literal matching) [[ "$t" =~ [abc]+[123]+ ]] # true (regular expression) [[ "$t" =~ "abc*" ]] # false (literal matching)
рдмреИрд╢ 3.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдЖрдкрдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЪрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
r="a b+" [[ "a bbb" =~ $r ]] # true
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреА рддреБрд▓рдирд╛ рдХреЗрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ:
case $t in abc*) <action> ;; esac
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ:
рдмреИрд╢ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ (рдХрдо) рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
рдЖрдзрд╛рд░:
f="path1/path2/file.ext" len="${#f}" # = 20 ( ) # : ${<>:<_>} ${<>:<_>:<_>} slice1="${f:6}" # = "path2/file.ext" slice2="${f:6:5}" # = "path2" slice3="${f: -8}" # = "file.ext" ( '-') pos=6 len=5 slice4="${f:${pos}:${len}}" # = "path2"
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди:
f="path1/path2/file.ext" single_subst="${f/path?/x}" # = "x/path2/file.ext" ( ) global_subst="${f//path?/x}" # = "x/x/file.ext" ( )
рдЪрд░ рдХрд╛ рдкреГрдердХреНрдХрд░рдг:
f="path1/path2/file.ext" readonly DIR_SEP="/" array=(${f//${DIR_SEP}/ }) second_dir="${array[1]}" # = path2
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣рдЯрд╛рдиреЗ:
# рдкрд╣рд▓реЗ рдореИрдЪ рддрдХ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ
f="path1/path2/file.ext" extension="${f#*.}" # = "ext"
# рдЖрдЦрд┐рд░реА рдореИрдЪ рддрдХ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ
f="path1/path2/file.ext" filename="${f##*/}" # = "file.ext"
# рдкрд╣рд▓реЗ рдореИрдЪ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ
f="path1/path2/file.ext" dirname="${f%/*}" # = "path1/path2"
# рд▓рд╛рдЗрди рд╕реЗ рдЕрдВрддрд┐рдо рдореИрдЪ рддрдХ рд╣рдЯрд╛рдПрдВ
f="path1/path2/file.ext" root="${f%%/*}" # = "path1"
рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ
рдХреБрдЫ рдХрдорд╛рдВрдбреНрд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, '<()' рдСрдкрд░реЗрдЯрд░ рдЙрдирдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдпрд╣ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
# рджреЛ URL рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░реЗрдВ
diff <(wget -O - url1) <(wget -O - url2)
рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЪрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
# рдорд╛рд░реНрдХрд░ - рдХреЛрдИ рднреА рд╢рдмреНрджред
command << MARKER ... ${var} $(cmd) ... MARKER
рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдорд╛рд░реНрдХрд░ рдХреЛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
# рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди '$ var' рд▓реМрдЯрд╛рдПрдЧрд╛ рди рдХрд┐ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡реИрд▓реНрдпреВ
var="text" cat << 'MARKER' ... $var ... MARKER
рдирд┐рд░реНрдорд┐рдд рдЪрд░
- $ 0 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд╛рдо
- $ 1 $ 2 ... $ n рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди (рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддреА рдорд╛рдирджрдВрдб) рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛
- $ $ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреАрдЖрдИрдбреА тАЛтАЛ(рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреАрдЖрдИрдбреА)
- $! рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛ(рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рд╛рдПрдВ)
- $? рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рддрд┐ рд╡рд╛рдкрд╕ рдЖ рдЧрдИ (рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рдХрд╛ рдирд┐рдХрд╛рд╕ рд╕реНрдерд┐рддрд┐ (рдкрд╛рдЗрдкрд▓рд╛рдЗрдб рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП $ {PIPESTATUS}))
- $ # рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛)
- $ @ рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ (рдЕрд▓рдЧ рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рджреЗрдЦреЗрдВ)
- $ * рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░, рдПрдХ рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдПрдХрд▓ рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рджреЗрдЦреЗрдВ)
- рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ:
- $ * рд╢рд╛рдпрдж рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИ
- $ @ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ
- $ @ рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдгреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрддрд╛ рд╣реИ - "$ @"
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
for i in "$@"; do echo '$@ param:' $i; done for i in "$*"; do echo '$! param:' $i; done
рдирд┐рд╖реНрдХрд░реНрд╖:
bash ./parameters.sh arg1 arg2 $@ param: arg1 $@ param: arg2 $! param: arg1 arg2
рдбрд┐рдмрдЧрд┐рдВрдЧ
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд╛рдБрдЪ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ 15 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдЪрд▓рдиреЗ рдкрд░ рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИ):
bash -n myscript.sh
рдЕрдиреБрд░реЗрдЦрдг:
bash -v myscripts.sh
рдЬрдЯрд┐рд▓ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЗрдЦрдг:
bash -x myscript.sh
-V рдФрд░ -x рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдорд╢реАрди рдкрд░ рдЪрд▓рддреА рд╣реИ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдирд┐рдореНрди рдкрд░ рд╣реИ:
set -o verbose set -o xtrace
рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреБрдЫ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред
- рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдЖрдк рдЙрджреНрдзрд░рдг рдФрд░ рднрд╛рдЧрдиреЗ рдХреЗ рд╕рд╛рде рдЕрд╢реНрд▓реАрд▓ рдХрд░рдиреЗ рд╕реЗ рдмреАрдорд╛рд░ рд╣реИрдВред
- рдЖрдкрдХреЛ рдХрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд / рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдЖрдкрдХреЛ рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╛рдЗрдк рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рдЧрддрд┐ / рдкреНрд░рджрд░реНрд╢рди рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдЖрдЗрдЯрдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдпрд╛ рд░реВрдмреА рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕рдВрджрд░реНрдн:
рдЙрдиреНрдирдд рдмреИрд╢-рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЧрд╛рдЗрдб: tldp.org/LDP/abs/html
рдмреИрд╢ рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓: www.gnu.org/software/bash/manual/bashref.html
рдореВрд▓ рд▓реЗрдЦ: robertmuth.blogspot.ru/2012/08/better-bash-scripting-in-15-miner.html