Shell Script 基礎



1、第一行寫#!/bin/bash再給腳本加上可執行權限就可以用./name.sh執行,否則需要用sh name.sh來執行腳本

2、-x執行時參數,打印每步執行的命令

3、內建命令:內建命令比外部命令執行的快

  type: type commandname來查看是否爲內建命令eg:type cd

     . 和 source : “.”“source”可以執行沒有執行權限的腳本eg: . ./hello.sh or source hello.sh

     bg fg & jobs:在命令後直接加&命令可以在後臺執行;當一個命令已經開始執行,用Ctrl+z將命令暫停,在用jobs查看暫停命令的編號,再用bg number 來將命令後臺執行;用fg number可將後臺的命令調至前臺執行。

  echo:打印一行字符,用-n參數可也不打印換行符,-e參數可也識別打印轉義字符。echo對引號不敏感,但是使用轉義字符時最好加上雙引號。

  eval:執行參數中的命令。eg: name1=a name2=b eval $name1=”$name2” echo $a b

   exec:執行當前命令,完成後退出shell

  export:使父shell的變量在子shell中可見。

  let:整數運算命令, eg:let i=2+2  let i++

     pwd:輸出工作目錄,-P參數可以輸出鏈接的源目錄;$OLDPWD上次工作目錄

  local:局部變量,常用於函數體內

  read:從標準輸入讀入一行變量,-p參數可以輸出提示;默認保存在REPLY變量中,也可以指定變量名。

  return:從函數中返回,後接一個整數n

  shift:將所有參數左移一個單位;

  test:測試表達式,成功返回1否則返回0

    exit: 退出當前shell,後接一個返回值。該值有相關規定。

4、變量

  變量的定義:變量名=變量值 變量名大小寫敏感,等號兩側不能有空格,無引號、單引號、雙引號不敏感。但加雙引號是安全的方法。

  變量的引用:${name}花括號不敏感,但加花括號是安全的方法。

  變量的位置不敏感,但可以用“shopt -s -o nounset”設置爲必須先聲明後引用。

  取消變量(函數):unset name

  特殊變量:$0~$N,分別表示shell名以及後面的參數,參數從$1開始,$#表示參數的個數N,不包含$0;$@$*表示所有的參數$1~$N。當N>=10是需要用${N}來引用。$?上一個命令的返回值(linux中規定正常退出的命令和腳本應該以0作爲返回值)。$!最後一個後臺進程的ID號。

  只讀變量:readomly name=100

     作用域:本shell內,包括子shell和函數內。可以用local來指定函數內的局部變量。

  shopt -s -o nounset :設置變量先聲明後引用

5、數組(只支持一維數組)

  數組定義:declare -a array  array[0]=0 array[1]=”hello”

                 declare -a name=(“john” “use”) name[2]='wang'

                 name=(“love” “world”)

                 score=([1]=1[3]=3 [9]=0)

  數組取值:${name[index]}

       ${name[@]}取出所有元素以空格分隔

       ${name[*]}取出所有元素不分隔(一個整字符串)

                       ${#name[$]}${#name[*]}數組元素個數;${#name[index]}該元素的長度

                       ${name[@]:from:to}取出從fromto的元素;${name[index]:from:to}取出該元素的相應值

              ${arraya[@] arrayb[@]}數組連接

             array=(${array[@]/world/tomorrow})將數組中值爲world的元素的值替換爲tomorrow   

  數組取消:unset array unset array[index]

6、引用

  雙引號:引號內的特殊字符會被解釋成特殊字符

  單引號:引號內的特殊字符不會被解釋爲特殊字符,當做普通字符對待。

  反引號:執行命令,於$(command)效果相同,但是$(command)支持嵌套。

7、計算

  簡單計算:$[]或者 $(()) echo $[1-0] echo $((5**2))值爲25

  賦值計算:let “value=~8” 或者 declare -i var    var=1+1此時var的值爲2,參數i表示整數,不能省略。或者用expr,可以計算加減乘除,但操作數和操作符之間要有空格。

  其他使用bc

8、花括號

  變量擴展:${#name}變量name的長度

                    ${!name*} ${!name@}匹配name開頭的字符

                 file_{A,B}匹配file_Afile_B

  排列組合:echo {x1,x2,x3}{y1,y2,y3}結果爲x1y1 x1y2 x1y3 x2y1 x2y2x2y3 x3y1 x3y2 x3y3

          string=abcdcba

    替換:newstring=${string/a/b} #將$string中第一個匹配到的a替換爲b,支持轉義字符。結果bbcdcba

          newstring=${strint//a/b}#將$string中所有a替換爲b,支持轉義字符。結果bbcdcbb

    刪除:#:從左邊開始最短匹配。    newstring=${string#*c} # 結果dcba

          ##:從左邊開始最長匹配。   newstring=${string##*c} # 結果ba

          % :從右邊開始最短匹配。   newstring=${string%c*} # 結果 abcd

          %%:從右邊開始最長匹配。   newstring=${string%%c*} # 結果ab  

9、測試 test expression 或者 [ expression ]

   文件測試:test operation file  或者 [ operation file ]

       -d -l -p  是目錄、連接、管道文件則返回真

       -e文件存在則返回真

       -f普通文件則返回真

       -x -w -r可執行、可寫、可讀文件則返回真

       file1 -nt file2 如果 file1 file2新則返回真

       file1 -ot file2 如果file1file2舊則返回真

  字符串測試:-z爲空時返回真  -n飛空時返回真

        = != > <用於比較兩個字符串

        在字符串比較中有些需要對操作符轉義,但使用 [[  ]] 則不需要,[[中間沒有空格。

  整數比較: -eq -gt -lt -ge -le -ne 等於 大於 小於 大於等於 小於等於 不等於

  邏輯運算:! -a -o或者 ! && ||

10、條件 if elif else

  if expression1 ; then

                 command1

  elif expression2 ; then

                 command1

  

  else

                command

  fi

11、分支 case

  case VAR in

     var1) command1 ;;

   var2) command2 ;;

  

   *) command ;;

  esac

  注:;; 是一個符號,中間沒有空格

12、循環 for while until select

  for循環:帶列表(若不帶列表則默認列表爲$@

                  for VARIABLE in (list)

                  do

                             command

                  done

      類C循環

                  for (( expression1;expression2; expression3))

                  do

                          command

                  done

  while循環:語法

                 while expression

                    do

                               command

                    done

                  典例(按行讀取文件)

                  while read LINE                                 

                  do                                                        

                           command                                    

                  done < finename                                  

     注:until循環於while循環相似,只是條件相反

  select循環:自動將列表中的元素生產數字索引,並等等用戶輸入,如果不輸入則一直等待。

                  Select MENU in (list)

                  do

                           command

                  done

                 注:用戶輸入的是數字

  break continue:後面可以接數字,表示跳出循環的層數。

13、函數:語法

                  function functionname() 

                  {

                           commands

                           return 0

                  }

          調用:functionname [parm1 parm2 ...]

     注:function關鍵字可以省略,return可以省略,通常正確執行的返回0,返回值只標明函數正確執行與否,echo可以實現c中的“返回值"

              return 的取值範圍是0-255,0位true,其他均爲false,該值不輸出到標準輸出,故不可以給變量賦值。該值值保存在$?中。

       參數的使用同於腳本操作參數方法相同,函數支持遞歸

     導入(類似於C中的include),在/etc/init.d/functions有一些庫函數可以使用。

             . filename

                source filename

14Here Document:用於在腳本中按行輸入

                   command << END

                   (input)

                   END

                  注:<< (END)符號 要緊跟在命令後面,不要換行

         (END)結束符號要最左對齊,不要加白格。

15、$

    取變量並賦值給另一個變量。eg:a=$b c=$((1+1))

15、(),(())

    ():shell命令塊,與{}相同。eg:(cmd1;cmd2;cmd3)

    $():執行shell命令並可以賦值變量,與``相同。eg:a=$(ls)

    a=(1 2 3):數組賦值

    (())執行C語言運算塊。eg:((a++)),((2+3)),((a>1)),((i=0;i<5;i++))

    $(()):執行運算並賦值。eg:a=((5+5))

16、[],[[ ]]

    []:test或者正則表達式

    a[3]:數組索引

    [[ ]]:test,支持變量和轉義字符等

17、{}

    {}:代碼塊,與()相同

    ${name}:變量引用

    {}:擴展匹配。eg:ls {a,b}.sh => a.sh b.sh

18、自增

   a=1

   ((a++))

   a=$((a+1)),a=$(($a+1))

   a=$[a+1],a=$[$a+1]

19、遞歸

   function mult()

   {

      if [ $1 -eq 1 ]; then

        echo 1

      else

        echo $(($1*`mult $(($1-1))`))

      fi

    }

    echo `mult 5`

    120

    或者

    mulLine(){ test $1 -eq 1 && echo 1 || echo $[$1*$(mulLine $[$1-1])]

    }

    echo $(mulLine 5)

    120

    # { 後面必須有一個空格,}必須另起一行

20、調用c程序

    c程序經過編譯以後就是Linux下一個可執行文件,與普通的shell命令沒有卻別,可以直接調用

    如果hello在當前目錄下,則可以在shell中用 ./hello調用

    賦值給變量:a=`./hello` # 可以接受stdout的結果,即printf的值。

    ./是目錄相對尋址,不是執行的語句,也可以直接用絕對地址執行/home/hs/wrokspace/hello來執行

    例子

    #!/bin/sh

    PATH=$PATH:$(pwd)

    c=`hello`

    echo $c

    輸出:Hello World!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章