Bash Script Basic Syntax

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

  1. 第十三章菊碟、學(xué)習(xí) 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末春弥,一起剝皮案震驚了整個濱河市萎河,隨后出現(xiàn)的幾起案子佃乘,更是在濱河造成了極大的恐慌忘苛,老刑警劉巖浦徊,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒楼,死亡現(xiàn)場離奇詭異园匹,居然都是意外死亡雳刺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門裸违,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掖桦,“玉大人,你說我怎么就攤上這事供汛∏雇簦” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵怔昨,是天一觀的道長雀久。 經(jīng)常有香客問我,道長趁舀,這世上最難降的妖魔是什么赖捌? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮赫编,結(jié)果婚禮上巡蘸,老公的妹妹穿的比我還像新娘。我一直安慰自己擂送,他們只是感情好悦荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘹吨,像睡著了一般搬味。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟀拷,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天碰纬,我揣著相機(jī)與錄音,去河邊找鬼问芬。 笑死悦析,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的此衅。 我是一名探鬼主播强戴,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亭螟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骑歹?” 一聲冷哼從身側(cè)響起预烙,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎道媚,沒想到半個月后扁掸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最域,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年谴分,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羡宙。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸剃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狗热,到底是詐尸還是另有隱情,我是刑警寧澤虑省,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布匿刮,位于F島的核電站,受9級特大地震影響探颈,放射性物質(zhì)發(fā)生泄漏熟丸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一伪节、第九天 我趴在偏房一處隱蔽的房頂上張望光羞。 院中可真熱鬧,春花似錦怀大、人聲如沸纱兑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜慎。三九已至,卻和暖如春蓖康,著一層夾襖步出監(jiān)牢的瞬間铐炫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工蒜焊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倒信,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓泳梆,卻偏偏與公主長得像鳖悠,于是被迫代替她去往敵國和親榜掌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容