Brace Expansion
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Special Variables
$? Exit value of last executed command.
pid=$!
wait $pid
$! Process number of last background command.
$0 First word; that is, the command name. This will have the full pathname if it was found via a PATH search.
$n Individual arguments on command line (positional parameters).
$# Number of command-line arguments.
“$*” All arguments on command line as one string (“$1 $2…”). The values are separated by the first character in $IFS.
“$@” All arguments on command line, individually quoted (“$1” “$2” …).
Tests
-n string is not null.
-z string is null, that is, has zero length
Testing for File Characteristics
-d File is a directory
-e File exists
-f File is a regular file
-s File has a size greater than zero
-r, -w, -x, -s - socket
[ -d "$dir" ] && echo "$dir exists." || echo "$dir doesn't exists."
Testing with Pattern Matches
== pattern
=~ ere
if [[ "${MYFILENAME}" == *.jpg ]]
-a, &&
-o, ||
if [ ! -d $param ]
if [ $? -ne 0 ]
Parsing
HEAP_DUMP_DIR=$(sed 's/-XX:HeapDumpPath=\([^ ]*\)/\1/' <<< $param)
Function
Use variable $1, $2..$n to access argument passed to the function.
Hello () {
echo "Hello $1 $2"
return 10
}
Return value in bash
echo in the function, capture the result in caller $()
Hello a b
for i in $( command ); do command $i; done
for i in $( command ); do
command $i
done
if [ "$var" == "value" ]; then
else
fi
Google Shell Style Guide
quote your variables; prefer "${var}" over "$var",
Use
while IFS=, read var1 var2 var3; do
Use Local Variables
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Special Variables
$? Exit value of last executed command.
pid=$!
wait $pid
$! Process number of last background command.
$0 First word; that is, the command name. This will have the full pathname if it was found via a PATH search.
$n Individual arguments on command line (positional parameters).
$# Number of command-line arguments.
“$*” All arguments on command line as one string (“$1 $2…”). The values are separated by the first character in $IFS.
“$@” All arguments on command line, individually quoted (“$1” “$2” …).
Tests
-n string is not null.
-z string is null, that is, has zero length
Testing for File Characteristics
-d File is a directory
-e File exists
-f File is a regular file
-s File has a size greater than zero
-r, -w, -x, -s - socket
[ -d "$dir" ] && echo "$dir exists." || echo "$dir doesn't exists."
Testing with Pattern Matches
if [[ "${MYFILENAME}" == *.jpg ]]
-a, &&
-o, ||
if [ ! -d $param ]
if [ $? -ne 0 ]
Parsing
HEAP_DUMP_DIR=$(sed 's/-XX:HeapDumpPath=\([^ ]*\)/\1/' <<< $param)
Function
Use variable $1, $2..$n to access argument passed to the function.
Hello () {
echo "Hello $1 $2"
return 10
}
Return value in bash
echo in the function, capture the result in caller $()
Hello a b
for i in $( command ); do command $i; done
for i in $( command ); do
command $i
done
if [ "$var" == "value" ]; then
else
fi
Google Shell Style Guide
quote your variables; prefer "${var}" over "$var",
Use
$(command)
instead of backticks.[[ ... ]]
is preferred over [
, test
- [[ ... ]]
reduces errors as no pathname expansion or word splitting takes place between [[
and ]]
and [[ ... ]]
allows for regular expression matching where [ ... ]
does not
Use readonly
or declare -r
to ensure they're read only.
Make variable readonly: readonly var=value
Make function readonly: readonly -f function
readonly -p/-f
if [[ -f ~/.bashrc ]]; then
source ~/.bashrc
fi
[ ! -f $FILE ] && { echo "$FILE not found"; exit -1; }
$(( $a+$b )) to execute arithmetic expressions
Put ; do and ; then on the same line as the while, for or if.
Prefer brace-quoting all other variables.
Use "$@" unless you have a specific reason to use $*.
- "$@" will retain arguments as-is, so no args provided will result in no args being passed on;
- "$*" expands to one argument, with all args joined by (usually) spaces, so no args provided will result in one empty string being passed on.
while IFS=, read var1 var2 var3; do
...
done < file.txt
local var="something"
local var
var="$(func)" || return
if [[ "${my_var}" = "some_string" ]]; then
do_something
fi
-z (string length is zero) and -n (string length is not zero)
if ! mv "${file_list}" "${dest_dir}/" ; then
fi
local var
var="$(func)" || return
if [[ "${my_var}" = "some_string" ]]; then
do_something
fi
-z (string length is zero) and -n (string length is not zero)
if ! mv "${file_list}" "${dest_dir}/" ; then
fi
Use set -o errexit (a.k.a. set -e) to make your script exit when a command fails.
Then add || true to commands that you allow to fail.
set -e - enable exit immediately
set +e - disable exit immediately
set -x - print a trace Use set -o nounset (a.k.a. set -u) to exit when your script tries to use undeclared variables.
Use set -o xtrace (a.k.a set -x) to trace what gets executed. Useful for debugging.
set -u Fail for undefined variable (set -o nounset)
Use $(( ... )), not expr for executing arithmetic expressions. which is more forgiving about space
set +e - disable exit immediately
set -x - print a trace Use set -o nounset (a.k.a. set -u) to exit when your script tries to use undeclared variables.
Use set -o xtrace (a.k.a set -x) to trace what gets executed. Useful for debugging.
set -u Fail for undefined variable (set -o nounset)
Use $(( ... )), not expr for executing arithmetic expressions. which is more forgiving about space
Use (( or let, not $(( when you don't need the result
Identify common problems with shellcheck.
Misc
while true; do some_commands_here; done
while true
do
some_commands_here
done
Run command until success
until $the_command; do echo "Try again"; done
while [ -n $(the command) ]; do echo "Try again";done;
Related
Essential Linux Commands for Developers
Misc
while true; do some_commands_here; done
while true
do
some_commands_here
done
Run command until success
until $the_command; do echo "Try again"; done
while [ -n $(the command) ]; do echo "Try again";done;
Related
Essential Linux Commands for Developers