Bash Script Basic Syntax

1 BASH Programming - Introduction HOW-TO :http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html

  1. 第十三章、学习 Shell Scripts : http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_1.php
  2. check CS246's official note (Excellent !)

5. Variables

You can use variables as in any programming languages. There are no data types. A variable in bash can contain a number, a character, a string of characters.

You have no need to declare a variable, just assigning a value to its reference will create it.

5.1 Sample: Hello World! using variables

             #!/bin/bash          
            STR="Hello World!"
            echo $STR    

5.2 Sample: A very simple backup script (little bit better)

            #!/bin/bash          
           OF=/var/my-backup-$(date +%Y%m%d).tgz
           tar -cZf $OF /home/me/

Some more examples:

echo ls
echo $(ls)

5.3 Local variables

Local variables can be created by using the keyword local. (default is global variable)

                 #!/bin/bash
                HELLO=Hello 
                function hello {
                        local HELLO=World
                        echo $HELLO
                }
                echo $HELLO
                hello
                echo $HELLO

can use 'unset var' to remove variable


Condition

6.4 Sample: Conditionals with variables

             #!/bin/bash
            T1="foo"
            T2="bar"
            if [ "$T1" = "$T2" ]; then
                echo expression evaluated as true
            else
                echo expression evaluated as false
            fi

Use 'test expr' or '[ expr ]' to run the expr. Return 0 if the expression is true and 1 otherwise
e.g:

i=3
test 3 -lt 4
echo ${?}  #true

test `whoami`=jinchao  # equal to [ `whoami`=jinchao ]
echo ${?}

test 2 -lt ${i} -o `whoami`=jinchao   #compound test, expr1 -o expr2: logical or; 
                        expr1 -a expr2 : logical and;

[ -e a.cc ] # file test, exist a file called 'a.cc' under current directory

Loop

7.1 For sample

         #!/bin/bash
        for i in $( ls ); do
            echo item: $i
        done

7.2 C-like for

fiesh suggested adding this form of looping. It's a for loop more similar to C/perl... for.

        #!/bin/bash
        for i in `seq 1 10`;
        do
                echo $i
        done    

7.3 While sample

          #!/bin/bash 
         COUNTER=0
         while [  $COUNTER -lt 10 ]; do
             echo The counter is $COUNTER
             let COUNTER=COUNTER+1 
         done

This script 'emulates' the well known (C, Pascal, perl, etc) 'for' structure

7.4 Until sample

          #!/bin/bash 
         COUNTER=20
         until [  $COUNTER -lt 10 ]; do
             echo COUNTER $COUNTER
             let COUNTER-=1
         done

Function

  • Declaring a function is just a matter of writing function my_func { my_code }.

  • Calling a function is just like calling another program, you just write its name.

8.1 Functions sample

            #!/bin/bash 
           function quit {
               exit
           }
           function hello {
               echo Hello!
           }
           hello
           quit
           echo foo 

8.2 Functions with parameters sample

                 #!/bin/bash 
                function quit {
                   exit
                }  
                function e {
                    echo $1 
                }  
                e Hello
                e World
                quit
                echo foo 

User Interface

9.1 Using select to make simple menus

            #!/bin/bash
           OPTIONS="Hello Quit"
           select opt in $OPTIONS; do
               if [ "$opt" = "Quit" ]; then
                echo done
                exit
               elif [ "$opt" = "Hello" ]; then
                echo Hello World
               else
                clear
                echo bad option
               fi
           done

If you run this script you'll see that it is a programmer's dream for text based menus. You'll probably notice that it's very similar to the 'for' construction, only rather than looping for each 'word' in $OPTIONS, it prompts the user.

9.2 Using the command line

           #!/bin/bash        
          if [ -z "$1" ]; then 
              echo usage: $0 directory
              exit
          fi
          SRCD=$1
          TGTD="/var/backups/"
          OF=home-$(date +%Y%m%d).tgz
          tar -cZf $TGTD$OF $SRCD

What this script does should be clear to you. The expression in the first conditional tests if the program has received an argument ($1) and quits if it didn't, showing the user a little usage message. The rest of the script should be clear at this point.


Misc

10.1 Reading user input with read

                 #!/bin/bash
                echo Please, enter your name
                read NAME
                echo "Hi $NAME!"
  • As a variant, you can get multiple values with read, this example may clarify this.
                 #!/bin/bash
                echo Please, enter your firstname and lastname
                read FN LN 
                echo "Hi! $LN, $FN !"

10.2 Arithmetic evaluation

echo 1 + 1   # wrong
echo $((1+1))  # correct
echo $[1+1]  # correct
  • If you need to use fractions, or more math or you just want it, you can use bc to evaluate arithmetic expressions.
  • if i ran "echo $[3/4]" at the command prompt, it would return 0 because bash only uses integers when answering. If you ran "echo 3/4|bc -l", it would properly return 0.75.

10.4 Getting the return value of a program

In bash, the return value of a program is stored in a special variable called $?.

This illustrates how to capture the return value of a program, I assume that the directory dada does not exist. (This was also suggested by mike)

         #!/bin/bash
        cd /dada &> /dev/null
        echo rv: $?
        cd $(pwd) &> /dev/null
        echo rv: $?

---- output ----
rv: 1 # dada not exit, return 1 (error)
rv: 0 # pwd excute successfully, return 0 (normal)

exit [N] : N=0 menas success; else means error

10.5 Capturing a commands output (important)

This little scripts show all tables from all databases (assuming you got MySQL installed). Also, consider changing the 'mysql' command to use a valid username and password.

         #!/bin/bash
        DBS=`mysql -uroot  -e"show databases"` # run a command and capture the return in DBS
        for b in $DBS ;
        do
                mysql -uroot -e"show tables from $b"
        done

你可能感兴趣的:(Bash Script Basic Syntax)