#!/bin/bash
- ftp://ftp.beandog.org/rsyncd/dotfiles/.bashrc.extra - My cross-platform
.bashrc.extra
:D - bash Cheat Sheet - some pretty advanced stuff
- Use the Unofficial Bash Strict Mode (Unless You Looove Debugging) - strict mode to help find bugs
String Operators
- -a and
- -o or
- = or == equal to
- -n string is not null
- -z string is null, that is, has zero length
Numeric Operators
- -eq number equals
- -ne number does not equal
- -gt greater than
- -ge greater than or equal to
- -lt less than
- -le less than or equal to
File Operators
- -e file exists (returns false in Bourne shell if file is a symlink)
- -f file is not a directory or device file
- -d file exists and is a directory
- -h file exists and is a symlink (also -L)
- -s file exists and has a size greater than zero
- -w file exists and is writeable
- -x file exists and is executable
- -r file exists and is readable
- -b file is a block device
- -c file is a character device
- -p file is a pipe
- -S file is a socket
- -O you are owner of file
- -G you are group owner of file
Regular Expressions
Use =~
followed by a regular expression pattern. Do not enclose the pattern in quotes if using in a test
block.
Check if a variable is a positive integer:
[[ $1 =~ ^[0-9]+$ ]]
Functions
Functions are created and called the same as any shell script: use command line arguments as parameters to pass, and echo any output.
function parse_input() { INPUT=$1 echo "You passed ${1} as an argument" }
Read each line
cat filename | while read line; do echo "Your line says ${line}" done
String subset
Syntax: ${variable:<starting integer>[:<num characters>]}
string="O hai" echo ${string:2} # returns hai
Strings
Get string length
${#string} expr length $string
Find the index of the first occurrence of a letter in a string
Returns 0 on not found.
expr index abcdefg d
Strings as commands
You need to use eval
to reparse a command through bash.
See here
#!/bin/bash cmd="date --date=\"1 days ago\"" $cmd # Doesn't work eval $cmd # Works
Simple sed replacement
echo testing testing2 | sed -e 's/ /\|/' # returns testing|testing2
Simple cut with a delimiter, grabbing a field
eix --only-names -Ie bash | cut -d "/" -f 2
Variables
- $# - number of bash arguments
- $* - display all variables passed
- $$ - pid of shell, or script being run
- $0 - name of the script
- $! - pid of last job run in background
- $_ - last command run, without the arguments
Displaying variables
When setting a variable using the backtick operator, use double quotes around the variable to retain newlines.
files=`ls` echo "$files"
Console settings
Get the size of the available cols, lines. Useful when writing shell applications that display output that needs to be paged:
tput cols tput lines
Cool bash stuff
- mktemp (coreutils) make a temporary file in /tmp
Get exit status from piped outputs
“Wonder piping!” –Shaine
$ true | false | true $ echo ${PIPESTATUS[*]}
Special variables
$#
Number of arguments on commandline.$?
Exit status of last command.$$
Process id of current program.$!
Process id of last backgroundjob or background function.$0
Program name including the path if started from another directory.$1..n
Commandline arguments, each at a time.$*
All commandline arguments in one string.
Colors
Color | Normal | Bold |
---|---|---|
Gray | 00;38 | 01;30 |
Black | 00;30 | |
Red | 00;31 | 01;31 |
Green | 00;32 | 01;32 |
Purple 1 | 00;33 | 01;33 |
Blue | 00;34 | 01;34 |
Purple 2 | 00;35 | 01;35 |
Cyan | 00;36 | 01;36 |
White | 00;37 | 01;38 |
Bright Blue | 01;37 | |
Yellow | 02;33 | |
Dark Gray |
Trapping signals
You can use trap
to capture a signal, such as Ctl-C to kill a command, and then map it to an internal function inside the bash script.
This is useful in scenarios where a shell script calls other scripts, and cancelling them would only cancel that one executed script instead of the main one.
control_c() { exit 1 } trap control_c INT
Command Line Control
- Delete: Ctrl W
- Clear Line: Ctrl U
- Start of Line: Ctrl A
- End of Line: Ctrl E
Check Input
Check to see if input is an integer:
if [[ $1 == ?(-)+([0-9]) ]]; then echo "$1 is an integer"; fi