Variables
bash does not seem to be able to shadow global readonly variables.
So, a local cannot shadow a global defined with declare -r.
So, e.g. this code:
declare -r port="{1:-}"
my_function(){
local port=${1:-1234}"
echo "Port: _$port_"
}
my_function "${port}"
Prints Port: __.
Special Variables
${@}: all parameters passed
$$: the PID of the currently running process
$_: the last parameter of the last command typed
E.g.
mkdir foobar
cd $_
# This will cd foobar
!!: recall last command typed
Eg.
# find . -name "*txt"
pippo.txt
$(!!): recall the last command typed
Eg.
# find . -name "*txt"
pippo.txt
# vi $(!!) # --> equivalent to: vi $(find . -name "*txt")
$*: All arguments separated by $IFS
$@: All arguments separated by
fooStar() { echo "$*" }
fooAt() { echo "$@" }
IFS="x" fooStar 1 2 3 4
# 1x2x3x4
IFS="x" fooAt 1 2 3 4
# 1 2 3 4
Parameters substitution
See also here: http://www.tldp.org/LDP/abs/html/parameter-substitution.html
${variable:-value}: if variable is set to a non-empty string, expands to ${variable}, otherwise expands to value.
${variable-value}: if variable is set (also if set to empty string), expands to ${variable}, otherwise expands to value.
${variable:+value}: if variable is set to a non-empty string, expands to value, otherwise expands to "".
${variable+value}: if variable is set (also if set to empty string), expands to value, otherwise expands to "".
${variable#string}: trim string PREFIX from variable.
${variable%string}: trim string SUFFIX from variable.
${variable,,}: bash Expands to lower case ${variable}.
${variable:l}: zsh Expands to lower case ${variable}.
${variable^^}: bash Expands to upper case ${variable}.
${variable:u}: zsh Expands to upper case ${variable}.
${variable%pattern}: Remove from ${variable} the shortest pattern ${pattern}.
${variable%%pattern}: Remove from ${variable} the longest pattern ${pattern}.
"${!prefix@}": Expands to the names of variables whose names begin with prefix. Each variable name expands to a separate word.
${!name}: Adds a indirection. Expands to ${${name}}. E.g.:
$ /bin/sh -c 'foo=bar; bar=fax; echo ${!foo}'
fax
E.g.
var="foobar"
${var%o*r} # => fo : removes shortest "obar" pattern
${var%%o*r} => f : remove longer "oobar" pattern
${variable/pattern/replacement} : replace FIRST pattern with replacement in ${variable}.
(If replacement is empty, just delete pattern).
${variable/#pattern/replacement} : like normal replace, but pattern is a PREFIX of
${variable}
${variable/%pattern/replacement} : like normal replace, but pattern is a SUFFIX of
${variable}
${variable//pattern/replacement} : replace ALL pattern with replacement in ${variable}.
(If replacement is empty, just delete pattern).
${variable:N:L}: returns a slice of length L of variable, from offset N.