一葉笑天
          雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
          posts - 73,comments - 7,trackbacks - 0
           

          Bash Shell結構

          KornBash shells非常相似,但是還是有一些不同之處。Bash的結構如下所示。

          Bash Shell語法結構

          Shbang

          "shbang" 是腳本起始行,告訴kernel那個shell解析. #!位于行頭。例如#!/bin/bash

          注釋

          行注釋用#符號.例如:# This is a comment

          通配符

          例如*, ?, [ ] 用于文件名擴展。<, >, 2>, >>, | 符號用于IO和重定向和管道。為了保證這些符號不被解析,這個字符要被引起來。 例如:

          rm *; ls ??;  cat file[1-3];

          echo "How are you?"

          輸出顯示

          使用echo命令。使用`或者一對“”通配符。例如:

          echo "How are you?"

          局部變量

          局部變量作用于當前shell,shell結束時局部變量失效.例如

          variable_name=value

          declare variable_name=value

          name="John Doe"

          x=5

          全局變量

          全局變量也稱為環境變量. 例如:內建的帶-x選項的聲明函數也可以設置為環境變量。可以用export使用。例如:

          export VARIABLE_NAME=value

          declare -x VARIABLE_NAME=value

          export PATH=/bin:/usr/bin:.

          從變量中提取值

          使用$.例如:

          echo $variable_name

          echo $name

          echo $PATH

          讀取用戶輸入

          使用read讀入一行。例如:

          EXAMPLE

          echo "What is your name?"

          read name

          read name1 name2 ...

          參數

          可以從命令行傳入參數。位置參數用于從腳本中接收值。例如:

          At the command line:

          $ scriptname arg1 arg2 arg3 ...

          在腳本中:

          echo $1 $2 $3

          位置參數

          echo $*

          所有位置參數

          echo $#

          位置參數號

          數組

          Bourne shell使用位置參數創建單詞列表。除了位置參數外, Bash shell支持數組語法,起始索引是0。 Bash shell數組使用declare -a 命令創建。例如:

          set apples pears peaches  (positional parameters)

          echo $1 $2 $3

           

          declare -a array_name=(word1 word2 word3 ...)

          declare -a fruit=( apples pears plums )

          echo ${fruit[0]}

          算術

          C/TC shellsBourne shell, UNIX/Linux 命令的輸出可以指定到一個變量。Bash shell提供新的語法. 使用前端加$,例如:

          variable_name=`command`

          variable_name=$( command )

          echo $variable_name

           

          echo "Today is `date`"

          echo "Today is $(date)"

          算術

          Bash shells支持整數算術。declare -i 命名用于聲明一個整型變量。Korn shelltypeset命令也可以用于向后兼容。

          例如

          declare -i variable_name

          used for bash

          typeset -i variable_name

          can be used to be compatible with ksh

           

          (( n=5 + 5 ))

           

          echo $n

           

           

          操作符

          Bash shell 使用內建命令,類似于C語言。

          例如

          相等性:

          邏輯性:

          ==

          equal to

          &&

          and

          !=

          not equal to

          ||

          or

           

           

          !

          not

          關系型:

          > 

          greater than

          >=

          greater than, equal to

          < 

          less than

          <=

          less than, equal to

          條件語句

          If類似于C語言。if endif結束。 [[ ]] 用于模式匹配條件表達式。 [ ] 用于向后兼容Bourne shell。例如:

          The if construct is:

          if  command

          then

             block of statements

          fi

           

          if  [[ expression  ]]

          then

             block of statements

          fi

           

          if  (( numeric expression  ))

          then

             block of statements

          else

             block of statements

           fi

           

           

          The if/else construct is:

          if  command

          then

             block of statements

          else

             block of statements

          fi

           

          if  [[ expression ]]

          then

             block of statements

          else

             block of statements

          fi

           

          if  ((  numeric expression ))

          then

             block of statements

          else

             block of statements

          fi

           

          The case construct is:

          case variable_name in

             pattern1)

                statements

                   ;;

             pattern2)

                statements

                   ;;

             pattern3)

                   ;;

          esac

          case "$color" in

             blue)

                echo $color is blue

                   ;;

             green)

                echo $color is green

                   ;;

             red|orange)

                echo $color is red or orange

                   ;;

             *) echo "Not a matach"

                   ;;

          esac

          The if/else/else if construct is:

          if  command

          then

             block of statements

          elif  command

          then

             block of statements

          else if  command

          then

             block of statements

          else

             block of statements

          fi

          -------------------------

           

          if  [[ expression ]]

          then

             block of statements

          elif  [[  expression ]]

          then

             block of statements

          else if  [[  expression ]]

          then

             block of statements

          else

             block of statements

          fi

           

          --------------------------

           

          if  ((  numeric expression ))

          then

             block of statements

          elif  ((  numeric expression ))

          then

             block of statements

          else if  ((numeric expression))

          then

             block of statements

          else

             block of statements

          fi

          循環

          四種循環while, until, for, select.

          while循環后跟隨[],do關鍵字,代碼段,結束于done關鍵字。[[ ]]是新的測試操作符,老的[ ]仍舊向后兼容Bourne shell.

          until循環類似于while循環。

          for循環用于遍歷一個字列表。For循環后跟隨變量名,in關鍵字,字列表,代碼塊,結束于done關鍵字。

          select循環用于提示菜單選擇。

          循環控制命令是breakcontinue。

          例如

          while command                                until

           command

          do                                           do

             block of statements                     

           block of statements

          done                                         done

          -------------------------                  

           ---------------------------

          while [[ string expression ]]                until

           [[ string expression ]]

          do                                           do

             block of statements                       block

           of statements

          done                                         done

          -------------------------                ----------------------------

          while (( numeric expression ))               until

           (( numeric expression ))

          do                                           do

             block of statements                        

           block of statements

          done                                         done

           

          for variable in word_list                  

           select variable in word_list

          do                                           do

             block of statements                       block

           of statements

          done                                         done

          --------------------------                 

           ----------------------------

          for color in red green b                   

           PS3="Select an item from the menu"

          do                                           do

           item in blue red green

             echo $color                               echo

           $item

          done                                         done

           

          Shows menu:

          1. blue
          2. red
          3. green

          函數

          函數有兩種格式.一種格式來自于Bourne shell, Bash版本使用function關鍵字:例如

          function_name() {

             block of code

          }

          function  function_name {

             block of code

          }

          ------------------------

          function  lister {

             echo Your present working directory is `pwd`

             echo Your files are:

             ls

          }

           

          Bash Shell腳本例子:

          1   #!/bin/bash

              # GNU bash versions 2.x

          2   # The Party Program––Invitations to friends from the "guest" file

          3   guestfile=~/shell/guests

          4   if [[ ! –e "$guestfile" ]]

              then

          5       printf "${guestfile##*/} non–existent"

                  exit 1

              fi

          6   export PLACE="Sarotini's"

          7   (( Time=$(date +%H) + 1 ))

          8   declare -a foods=(cheese crackers shrimp drinks `"hot dogs"` sandwiches)

          9   declare -i  n=0

          10  for person in $(cat $guestfile)

              do

          11      if  [[ $person == root ]]

                  then

                        continue

                  else

                        # Start of here document

          12            mail –v –s "Party" $person <<- FINIS

                        Hi $person! Please join me at $PLACE for a party!

                        Meet me at $Time o'clock.

                        I'll bring the ice cream. Would you please bring

                        ${foods[$n] and anything else you would like to eat?

                        Let me know if you can make it.

                               Hope to see you soon.

                                    Your pal,

                                    ellie@$(hostname)

                        FINIS

          13            n=n+1

          14            if (( ${#foods[*]} ==  $n ))

                        then

          15               declare -a foods=(cheese crackers shrimp drinks `"hot dogs"`

                                             sandwiches)

          16            n=0

                        fi

                  fi

          17  done

              printf "Bye..."

          解釋

          1. kernel知道在運行Bash shell腳本.
          2. 注釋行
          3. 變量guestfile被設置為文件的全路徑名,叫做guests.
          4. 行讀入
          5. 內建函數printf顯示文件名
          6. 全局環境變量
          7. 數字表達式
          8. Bash數組foods定義
          9. 整數n定于初始值為0
          10. For循環
          11. If語句
          12. 發送mail消息
          13. 整數n1
          14. If語句
          15. 數組foods重新分配值
          16. 變量n重新設置回0
          17. 循環結束
          posted on 2008-07-08 09:38 一葉笑天 閱讀(359) 評論(0)  編輯  收藏 所屬分類: Shell技術
          主站蜘蛛池模板: 揭阳市| 虹口区| 威信县| 贵州省| 松阳县| 武功县| 普兰店市| 祁东县| 黑山县| 上饶县| 常宁市| 大理市| 昔阳县| 斗六市| 黎城县| 乌拉特前旗| 镇坪县| 都江堰市| 中山市| 双牌县| 林州市| 临猗县| 渭南市| 桂阳县| 龙南县| 顺平县| 阳新县| 交城县| 蕲春县| 绥德县| 邯郸市| 青冈县| 大方县| 吴江市| 枞阳县| 曲靖市| 萨迦县| 河间市| 曲阳县| 庆城县| 牟定县|