====== #!/bin/bash ======
* [[csh]]
* [[ksh]]
* [[sh]]
* [[tcsh]]
* [[zsh]]
* [[bash Built-In Commands]]
* [[bash completion]]
* [[bsfl]]
* [[getopts]]
* [[iterm]]
* [[ftp://ftp.gnu.org/gnu/bash/]]
* [[ftp://ftp.beandog.org/rsyncd/dotfiles/.bashrc.extra]] - My cross-platform ''.bashrc.extra'' :D
* [[http://www.aboutlinux.info/2005/10/10-seconds-guide-to-bash-shell.html|Bash Shell Scripting - 10 Seconds Guide]]
* [[http://tille.garrels.be/training/bash/ch07.html|Conditional statements]]
* [[http://hacktux.com/bash/colors|bash colors]]
* [[http://wiki.bash-hackers.org/doku.php|Bash Hackers wiki]]
* [[http://www.commandlinefu.com/commands/browse|commandlinefu.com]]
* [[http://www.mcsr.olemiss.edu/unixhelp/shell/oview1.1.html|Summary of shell facilities]]
* [[http://ss64.com/bash/|An A-Z Index of the Bash command line for Linux]]
* [[http://www.cheatography.com/oguzkonya/cheat-sheets/bash/|bash Cheat Sheet]] - some pretty advanced stuff
* [[http://www.cyberciti.biz/faq/linux-bash-delete-all-files-in-directory-except-few/|Delete All Files In Directory Except Few]]
* [[https://shellshocker.net/|Shellshocker]]
* [[http://redsymbol.net/articles/unofficial-bash-strict-mode/|Use the Unofficial Bash Strict Mode (Unless You Looove Debugging)]] - strict mode to help find bugs
* [[http://ascii-table.com/ansi-escape-sequences-vt-100.php|ANSI Escape Sequences]]
* [[https://mywiki.wooledge.org/BashPitfalls|Bash Pitfalls]]
== 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:[:]}
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 [[http://fvue.nl/wiki/Bash:_Why_use_eval_with_variable_expansion|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 ==
* [[http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html]]
* **$#** - 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