From charlesreid1

No edit summary
Line 39: Line 39:
To do some serious bash looping kung-fu, check out [[Xargs]].
To do some serious bash looping kung-fu, check out [[Xargs]].


== Math ==
== Logical Operators ==


=Bash Commands=
'''NOTE''': the use of double brackets for logical condition checks is highly recommended.


==Editing Commands==
There are several logical operators available for checking conditions in bash.
 
These can be tested using a simple "if" statement.  In bash, if statements are of the form:
 
<source lang="bash">
if [[ condition ]]; then
    cmd
else
    cmd2
fi
</source>
 
The spaces between the brackets and the condition are essential.
 
===Integer Operators===
 
{|border="1"; class="wikitable"
!Operator
!Meaning
!Example
 
|-
|<code>-eq</code>
|returns true if arguments are equal
|<source lang="bash">
$ a=1; b=1; if [[ "$a" -eq "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=1; b=2; if [[ "$a" -eq "$b" ]]; then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code>-ne</code>
|returns true if arguments are not equal
|<source lang="bash">
$ a=1; b=1; if [[ "$a" -ne "$b" ]]; then echo "true"; else echo "false"; fi
false
 
$ a=1; b=2; if [[ "$a" -ne "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code>-gt</code>
|returns true if argument 1 is greater than argument 2
|<source lang="bash">
$ a=5; b=10; if [[ "$a" -gt "$b" ]]; then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code>-ge</code>
|returns true if argument 1 is greater than or equal to argument 2
|<source lang="bash">
$ a=15; b=10; if [[ "$a" -ge "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=10; b=10; if [[ "$a" -ge "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code>-lt</code>
|returns true if argument 1 less than argument 2
|<source lang="bash">
$ a=5; b=10; if [[ "$a" -lt "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code>-le</code>
|returns true if argument 1 less than or equal to argument 2
|<source lang="bash">
$ a=15; b=10; if [[ "$a" -le "$b" ]]; then echo "true"; else echo "false"; fi
false
 
$ a=10; b=10; if [[ "$a" -le "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code> \< </code>
|returns true if argument 1 less than argument 2
 
this needs to be escaped with a \ if it occurs inside single brackets; otherwise it can appear between double bracket or between double parentheses
|<source lang="bash">
$ a=10; b=10; if [ "$a" \< "$b" ]; then echo "true"; else echo "false"; fi
false
 
$ a=10; b=10; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
false
 
$ a=10; b=10; if (( "$a" < "$b" )); then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code> <= </code>
|returns true if argument 1 less than or equal to argument 2
 
this operator needs to go inside double parentheses
|<source lang="bash">
$ a=10; b=10; if (( "$a" <= "$b" )); then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code> > </code>
|returns true if argument 1 greater than argument 2
 
this needs to be escaped with a \ if it occurs inside single brackets; otherwise it can appear between double bracket or between double parentheses
|<source lang="bash">
$ z=10; zz=1000;
 
$ if [ zz \> z ]; then echo "true"; else echo "false"; fi
true
 
$ if [[ zz > z ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code> >= </code>
|returns true if argument 1 greater than or equal to argument 2
 
this operator needs to go inside double parentheses
|<source lang="bash">
$ a=50; b=10; if (( $a >= $b )); then echo "true"; else echo "false"; fi
true
</source>
 
|}
 
===String Operators===
 
{|border="1"; class="wikitable"
!Operator
!Meaning
!Example
 
|-
|<code>=</code>
|returns true if two strings are equal
|<source lang="bash">
$ a=foo; b=foo; if [[ "$a" = "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=foo; b=bar; if [[ "$a" = "$b" ]]; then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code>==</code>
|returns true if two strings are equal; equivalent to <code>=</code>
|<source lang="bash">
$ a=foo; b=foo; if [[ "$a" == "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=foo; b=bar; if [[ "$a" == "$b" ]]; then echo "true"; else echo "false"; fi
false
</source>
 
Note the difference between quoting a string and not quoting a string:
 
<pre>
[[ $a ==  b*  ]] # returns true if $a starts with b (pattern matching)
[[ $a == "b*" ]] # returns true if $a is literally equal to b* (literal matching)
</pre>
 
|-
|<code>!=</code>
|returns true if strings are not equal
|<source lang="bash">
$ a=foo; b=bar; if [[ "$a" != "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code> < </code>
|returns true if argument 1 is less than (alphabetically) argument 2; capitals come before non-capitals
|<source lang="bash">
$ a=foo; b=bar; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
false
 
$ a=Foo; b=bar; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=bar; b=foo; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
true
</source>
 
|-
|<code> > </code>
|returns true if argument 1 is greater than (alphabetically) argument 2; capitals come before non-capitals
|<source lang="bash">
$ a=foo; b=bar; if [[ "$a" > "$b" ]]; then echo "true"; else echo "false"; fi
true
 
$ a=Foo; b=bar; if [[ "$a" > "$b" ]]; then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code>-z</code>
|returns true if the string is null
|<source lang="bash">
$ a=""; b="foobar"; if [ -z "$a" ]; then echo "true"; else echo "false"; fi
true
 
$ a=""; b="foobar"; if [ -z "$b" ]; then echo "true"; else echo "false"; fi
false
</source>
 
|-
|<code>-n</code>
|returns true if the string is NOT null
|<source lang="bash">
$ a=""; b="foobar"; if [ -n "$a" ]; then echo "true"; else echo "false"; fi
false
 
$ a=""; b="foobar"; if [ -n "$b" ]; then echo "true"; else echo "false"; fi
true
</source>
 
|}
 
 
===Compound Operators===
 
You can
 
 
 
 
 
      ! ~            logical and bitwise negation
      <>      left and right bitwise shifts
      =
                        comparison
      == !=      equality and inequality
      &              bitwise AND
      ^              bitwise exclusive OR
      |                bitwise OR
      &&            logical AND
      ||              logical OR
 
      expr?expr:expr
                        conditional operator
      = *= /= %= += -= <>= &= ^= |=
                        assignment
      expr1 , expr2
                        comma
 
== Basic Math Operators ==
 
You can do some basic integer math using bash as follows:
 
'''Addition'''
 
<source lang="bash">
$ sum=$((2+2))  &&  echo $sum
4
 
$ sum=$((sum+10))  &&  echo $sum
14
</source>
 
'''Subtraction'''
 
<source lang="bash">
$ diff=$((100-50))  &&  echo $diff
50
 
$ diff=$((diff-25))  &&  echo $diff
25
</source>
 
'''Multiplication'''
 
<source lang="bash">
$ prod=$((2*8))    &&  echo $prod
16
 
$ a=9; b=3; prod=$((a*b))    &&  echo $prod
27
</source>
 
'''Division'''
 
<source lang="bash">
$ a=14; b=2; div=$((a/b))  &&  echo $div
7
</source>
 
'''Remainder'''
 
<source lang="bash">
$ a=10; b=4; z=$((a%b))  &&  echo $z
2
</source>
 
'''Exponentiation'''
 
<source lang="bash">
$ z=5  &&  echo $z
5
 
$ zz=$((z**2))  &&  echo $zz
25
</source>
 
NOTE: ''Bash does integer math only!''  To do fraction math, use the program [[bc]] or [[awk]].
 
== Complex Math Operators ==
 
You can use the increment and decrement operators <code>++</code> and <code>--</code> as follow:
 
'''Increment++'''
 
The increment operator can be used as either a prefix or postfix operator, i.e. as <code>++i</code> or <code>i++</code>.  Example:
 
<source lang="bash">
$ z=1  &&  echo $z
1
 
$ ((++z))  &&  echo $z
2
 
$ ((++z))  &&  echo $z
3
 
$ ((++z))  &&  echo $z
4
</source>
 
This can be used in bash for loops as follows:
 
<source lang="bash">
for ((i=1; i <=$NUM ; i++)); do
    echo $i
done
</source>
 
'''Decrement--'''
 
Like the increment operator, this can be a prefix or postfix operator, i.e. <code>--i</code> or <code>i--</code>:
 
<source lang="bash">
$ z=1  &&  echo $z
1
 
$ ((--z))  &&  echo $z
 
$ ((--z))  &&  echo $z
-1
 
$ ((--z))  &&  echo $z
-2
 
$ ((--z))  &&  echo $z
-3
</source>
 
Notice that <code>echo $z</code> doesn't print anything if z=0.
 
=Bash Keyboard Shortcuts=
 
==Editing Shortcuts==


The following are keyboard shortcuts for easy navigation/editing of commands that are on the Bash command line.
The following are keyboard shortcuts for easy navigation/editing of commands that are on the Bash command line.

Revision as of 09:52, 12 April 2011

Bash Guide

Using Bash

Setting the default shell: http://www.unix.com/shell-programming-scripting/32664-how-change-default-shell-linux.html


Startup Process

source /etc/profile

source ~/.profile

(source ~/.bash_profile?)

source /etc/bashrc

source ~/.bashrc


Dot Files

Bash Scripting

Looping

Looping in bash is really simple, and convenient - you can use other unix commands (most obviously "ls") to create lists, and then loop over each element of those lists. For example, if I want to print out the name of every file in my home directory (granted, not very useful, but this is just an example), I can do this:

for i in `/bin/ls -1 $HOME`; do
    echo $i
done

To do some serious bash looping kung-fu, check out Xargs.

Logical Operators

NOTE: the use of double brackets for logical condition checks is highly recommended.

There are several logical operators available for checking conditions in bash.

These can be tested using a simple "if" statement. In bash, if statements are of the form:

if [[ condition ]]; then
    cmd
else
    cmd2
fi

The spaces between the brackets and the condition are essential.

Integer Operators

Operator Meaning Example
-eq returns true if arguments are equal
$ a=1; b=1; if [[ "$a" -eq "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=1; b=2; if [[ "$a" -eq "$b" ]]; then echo "true"; else echo "false"; fi
false
-ne returns true if arguments are not equal
$ a=1; b=1; if [[ "$a" -ne "$b" ]]; then echo "true"; else echo "false"; fi
false

$ a=1; b=2; if [[ "$a" -ne "$b" ]]; then echo "true"; else echo "false"; fi
true
-gt returns true if argument 1 is greater than argument 2
$ a=5; b=10; if [[ "$a" -gt "$b" ]]; then echo "true"; else echo "false"; fi
false
-ge returns true if argument 1 is greater than or equal to argument 2
$ a=15; b=10; if [[ "$a" -ge "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=10; b=10; if [[ "$a" -ge "$b" ]]; then echo "true"; else echo "false"; fi
true
-lt returns true if argument 1 less than argument 2
$ a=5; b=10; if [[ "$a" -lt "$b" ]]; then echo "true"; else echo "false"; fi
true
-le returns true if argument 1 less than or equal to argument 2
$ a=15; b=10; if [[ "$a" -le "$b" ]]; then echo "true"; else echo "false"; fi
false

$ a=10; b=10; if [[ "$a" -le "$b" ]]; then echo "true"; else echo "false"; fi
true
\< returns true if argument 1 less than argument 2

this needs to be escaped with a \ if it occurs inside single brackets; otherwise it can appear between double bracket or between double parentheses

$ a=10; b=10; if [ "$a" \< "$b" ]; then echo "true"; else echo "false"; fi
false

$ a=10; b=10; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
false

$ a=10; b=10; if (( "$a" < "$b" )); then echo "true"; else echo "false"; fi
false
<= returns true if argument 1 less than or equal to argument 2

this operator needs to go inside double parentheses

$ a=10; b=10; if (( "$a" <= "$b" )); then echo "true"; else echo "false"; fi
true
> returns true if argument 1 greater than argument 2

this needs to be escaped with a \ if it occurs inside single brackets; otherwise it can appear between double bracket or between double parentheses

$ z=10; zz=1000; 

$ if [ zz \> z ]; then echo "true"; else echo "false"; fi
true

$ if [[ zz > z ]]; then echo "true"; else echo "false"; fi
true
>= returns true if argument 1 greater than or equal to argument 2

this operator needs to go inside double parentheses

$ a=50; b=10; if (( $a >= $b )); then echo "true"; else echo "false"; fi
true

String Operators

Operator Meaning Example
= returns true if two strings are equal
$ a=foo; b=foo; if [[ "$a" = "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=foo; b=bar; if [[ "$a" = "$b" ]]; then echo "true"; else echo "false"; fi
false
== returns true if two strings are equal; equivalent to =
$ a=foo; b=foo; if [[ "$a" == "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=foo; b=bar; if [[ "$a" == "$b" ]]; then echo "true"; else echo "false"; fi
false

Note the difference between quoting a string and not quoting a string:

[[ $a ==  b*  ]] # returns true if $a starts with b (pattern matching)
[[ $a == "b*" ]] # returns true if $a is literally equal to b* (literal matching)
!= returns true if strings are not equal
$ a=foo; b=bar; if [[ "$a" != "$b" ]]; then echo "true"; else echo "false"; fi
true
< returns true if argument 1 is less than (alphabetically) argument 2; capitals come before non-capitals
$ a=foo; b=bar; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
false

$ a=Foo; b=bar; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=bar; b=foo; if [[ "$a" < "$b" ]]; then echo "true"; else echo "false"; fi
true
> returns true if argument 1 is greater than (alphabetically) argument 2; capitals come before non-capitals
$ a=foo; b=bar; if [[ "$a" > "$b" ]]; then echo "true"; else echo "false"; fi
true

$ a=Foo; b=bar; if [[ "$a" > "$b" ]]; then echo "true"; else echo "false"; fi
false
-z returns true if the string is null
$ a=""; b="foobar"; if [ -z "$a" ]; then echo "true"; else echo "false"; fi
true

$ a=""; b="foobar"; if [ -z "$b" ]; then echo "true"; else echo "false"; fi
false
-n returns true if the string is NOT null
$ a=""; b="foobar"; if [ -n "$a" ]; then echo "true"; else echo "false"; fi
false

$ a=""; b="foobar"; if [ -n "$b" ]; then echo "true"; else echo "false"; fi
true


Compound Operators

You can



      ! ~             logical and bitwise negation
      <>       left and right bitwise shifts
      =
                       comparison
      == !=       equality and inequality
      &               bitwise AND
      ^               bitwise exclusive OR
      |                bitwise OR
      &&             logical AND
      ||              logical OR
      expr?expr:expr
                       conditional operator
      = *= /= %= += -= <>= &= ^= |=
                       assignment
      expr1 , expr2
                       comma

Basic Math Operators

You can do some basic integer math using bash as follows:

Addition

$ sum=$((2+2))  &&   echo $sum
4

$ sum=$((sum+10))  &&   echo $sum
14

Subtraction

$ diff=$((100-50))   &&   echo $diff
50

$ diff=$((diff-25))   &&   echo $diff
25

Multiplication

$ prod=$((2*8))    &&   echo $prod
16

$ a=9; b=3; prod=$((a*b))    &&   echo $prod
27

Division

$ a=14; b=2; div=$((a/b))   &&   echo $div
7

Remainder

$ a=10; b=4; z=$((a%b))   &&   echo $z
2

Exponentiation

$ z=5   &&   echo $z
5

$ zz=$((z**2))   &&   echo $zz
25

NOTE: Bash does integer math only! To do fraction math, use the program bc or awk.

Complex Math Operators

You can use the increment and decrement operators ++ and -- as follow:

Increment++

The increment operator can be used as either a prefix or postfix operator, i.e. as ++i or i++. Example:

$ z=1   &&   echo $z
1

$ ((++z))   &&   echo $z
2

$ ((++z))   &&   echo $z
3

$ ((++z))   &&   echo $z
4

This can be used in bash for loops as follows:

for ((i=1; i <=$NUM ; i++)); do
    echo $i
done

Decrement--

Like the increment operator, this can be a prefix or postfix operator, i.e. --i or i--:

$ z=1   &&   echo $z
1

$ ((--z))   &&   echo $z

$ ((--z))   &&   echo $z
-1

$ ((--z))   &&   echo $z
-2

$ ((--z))   &&   echo $z
-3

Notice that echo $z doesn't print anything if z=0.

Bash Keyboard Shortcuts

Editing Shortcuts

The following are keyboard shortcuts for easy navigation/editing of commands that are on the Bash command line.

Movement

  • C-a - Move to beginning of line
  • C-e - Move to end of line


  • M-f - Move forward 1 word
  • M-b - Move backward 1 word


  • C-f - Move forward 1 character
  • C-b - Move backward 1 character

Cutting and Pasting

  • C-k - kill (cut) from cursor to end of line
  • C-w - kill (cut) from cursor to previous whitespace
  • C-y - yank (paste) previously killed text at cursor

Uncategorized

  • C-L - clear screen, reprint current line at top
  • C-u - undo last edit
  • C-d - delete character under cursor

References

Floating point math in the shell:

http://www.novell.com/coolsolutions/tools/17043.html

Fast bash math:

http://www.bytemycode.com/snippets/snippet/350/

Bash script iterate through array of values

http://www.tech-recipes.com/rx/636/bash-shell-script-iterate-through-array-values/