BASH QUICK LOOKUP GUIDE
The following provides a useful summary of certain scripting concepts.
The foregoing text treats these matters in more depth, as well as giving usage examples.
Table 1. Special Shell Variables
| Variable |
Meaning |
$0 | Filename of script |
$1 | Positional parameter #1 |
$2 - $9 | Positional parameters #2 - #9 |
${10} | Positional parameter #10 |
$# | Number of positional parameters |
"$*" | All the positional parameters (as a single word) * |
"$@" | All the positional parameters (as separate strings) |
${#*} | Number of positional parameters |
${#@} | Number of positional parameters |
$? | Return value |
$$ | Process ID (PID) of script |
$- | Flags passed to script (using set) |
$_ | Last argument of previous command |
$! | Process ID (PID) of last job run in background |
* Note: "$*" must be quoted, otherwise it defaults to $@.
Table 2. TEST Operators: Binary Comparison
| Operator (Arithmetic) |
Meaning |
Operator (String) |
Meaning |
| Standard Comparisons |
-eq | Equal to | = | Equal to |
| | | == | Equal to |
-ne | Not equal to | != | Not equal to |
-lt | Less than | \< | Less than (ASCII) * |
-le | Less than or equal to | | |
-gt | Greater than | \> | Greater than (ASCII) * |
-ge | Greater than or equal to | | |
| | -z | String is empty |
| | -n | String is not empty |
Arithmetic Comparison within double parentheses (( ... )) |
> | Greater than | | |
>= | Greater than or equal to | | |
< | Less than | | |
<= | Less than or equal to | | |
* Note: If within a double-bracket [[ ... ]] test construct, then no escape \ is needed.
Table 3. TEST Operators: Files
| Operator |
Tests Whether |
Operator |
Tests Whether |
-e | File exists | -s | File is not zero size |
-f | File is a regular file | | |
-d | File is a directory | -r | File has read permission |
-h | File is a symbolic link | -w | File has write permission |
-L | File is a symbolic link | -x | File has execute permission |
-b | File is a block device | | |
-c | File is a character device | -g | sgid flag set |
-p | File is a pipe | -u | suid flag set |
-S | File is a socket | -k | "sticky bit" set |
-t | File is associated with a terminal | | |
| |
-N | File modified since it was last read | F1 -nt F2 | File F1 is newer than F2 * |
-O | You own the file | F1 -ot F2 | File F1 is older than F2 * |
-G | Group id of file same as yours | F1 -ef F2 | Files F1 and F2 are hard links to the same file * |
| |
! | NOT (inverts sense of above tests) | | |
* Note: Binary operator (requires two operands).
Table 4. Parameter Substitution and Expansion
| Expression |
Meaning |
${var} | Value of var (same as $var) |
| |
${var-DEFAULT} | If var not set, evaluate expression as $DEFAULT * |
${var:-DEFAULT} | If var not set or is empty, evaluate expression as $DEFAULT * |
| |
${var=DEFAULT} | If var not set, evaluate expression as $DEFAULT * |
${var:=DEFAULT} | If var not set or is empty, evaluate expression as $DEFAULT * |
| |
${var+OTHER} | If var set, evaluate expression as $OTHER, otherwise as null string |
${var:+OTHER} | If var set, evaluate expression as $OTHER, otherwise as null string |
| |
${var?ERR_MSG} | If var not set, print $ERR_MSG and abort script with an exit status of 1. * |
${var:?ERR_MSG} | If var not set or is empty, print $ERR_MSG and abort script with an exit status of 1. * |
| |
${!varprefix*} | Matches all previously declared variables beginning with varprefix |
${!varprefix@} | Matches all previously declared variables beginning with varprefix |
* Note: If var is set, evaluate the expression as $var with no side-effects.
Table 5. String Operations
| Expression |
Meaning |
${#string} | Length of $string |
| |
${string:position} | Extract substring from $string at $position |
${string:position:length} | Extract $length characters substring from $string at $position [zero-indexed, first character is at position 0] |
| |
${string#substring} | Strip shortest match of $substring from front of $string |
${string##substring} | Strip longest match of $substring from front of $string |
${string%substring} | Strip shortest match of $substring from back of $string |
${string%%substring} | Strip longest match of $substring from back of $string |
| |
${string/substring/replacement} | Replace first match of $substring with $replacement |
${string//substring/replacement} | Replace all matches of $substring with $replacement |
${string/#substring/replacement} | If $substring matches front end of $string, substitute $replacement for $substring |
${string/%substring/replacement} | If $substring matches back end of $string, substitute $replacement for $substring |
Table 6. Miscellaneous Constructs
| Expression |
Interpretation |
| Brackets |
if [ CONDITION ] | Test construct |
if [[ CONDITION ]] | Extended test construct |
Array[1]=element1 | Array initialization |
[a-z] | Range of characters within a Regular Expression |
| Curly Brackets |
${variable} | Parameter substitution |
${!variable} | Indirect variable reference |
{ command1; command2; ... commandN; } | Block of code |
{string1,string2,string3,...} | Brace expansion |
{a..z} | Extended brace expansion |
{} | Text replacement, after find and xargs |
| Parentheses |
( command1; command2 ) | Command group executed within a subshell |
Array=(element1 element2 element3) | Array initialization |
result=$(COMMAND) | Command substitution, new style |
>(COMMAND) | Process substitution |
<(COMMAND) | Process substitution |
| Double Parentheses |
(( var = 78 )) | Integer arithmetic |
var=$(( 20 + 5 )) | Integer arithmetic, with variable assignment |
(( var++ )) | C-style variable increment |
(( var-- )) | C-style variable decrement |
(( var0 = var1<98?9:21 )) | C-style ternary operation |
| Quoting |
"variable" | "Weak" quoting |
'string' | 'Strong' quoting |
| Back Quotes |
result=`COMMAND` | Command substitution, classic style |