shell語法基礎


一、變量

1、linux大小寫敏感,變量取名要注意大小寫。可以通過變量名前面加$來訪問變量的內容。可以通過使用read命令來將用戶輸入的值賦給一個變量。

2、給變量賦值時,如果字符串中包含空格,就必須用引號把他們引起了,還要注意在等號兩邊不能有空格。

3、變量在雙引號中會用變量值替換,而在單引號中就不會替換,也可以通過轉義字符\來取消$的特殊含義。

例:myvar=“Hi there!”

    echo $myvar

    echo "$myvar"

    echo ' $myvar'

    echo \$myvar

將會輸出如下:Hi there!

              Hi there!

              $myvar

              $myvar

4、環境變量:環境變量通常用大寫字母做名字,為了與環境變量區別開來,用戶自定義變量一般都用小寫字母。

       常用的環境變量有:

         

       

二、控制結構

1、shell的布爾判斷命令[或test。test的三種條件類型:字符串比較、算術比較和文件有關的條件測試。

 

 

 

 

 

2、控制結構

Ø if語句:

      if  condition

      then

           statements

      else

            Statements

       Fi

例:#!/bin/sh

    if [ -f /root/cherie_test/test_path.sh ];then

       echo "/root/cherie_test/test_path.sh exists"

    fi

 

    if [ -d /root/cherie_test/test_path.sh ];then

       echo "/root/cherie_test/test_path.sh is a director"

   else

      echo "/root/cherie_test/test_path.sh  is not a directory"

   fi   

解析:[ ]前后都要有空格,不然會報[: missing `]'錯誤;if與[之間也需要有空格,沒有的話會報syntax error near unexpected token `then'錯誤。

 

Ø  elif語句。對if語句的進一步測試。

     例:#!/bin/sh

 

         echo "Is it morning? Please answer yes or no "

         read timeofday

 

         if[ $timeofday = "yes"]; then

            echo "Good morning"

            exit 0

         elif [ $timeofday = "no" ];then

            echo "Good afternoon"

            exit 0

         else

            echo "Sorry,$timeofday not recognized. Enter yes or no "

            exit 1 //異常退出

        fi

解析:elif會對在第一個if條件不滿足的情況下進行進一步測試,如果兩次測試的結果都不成功,就打印出一條錯誤信息並以1為退出碼退出。

 

Ø  for 語句。語法格式:for variable invalues

                         do

                             Statements

                          done

例:#!/bin/sh

    for file in $(ls f*.sh); do

        lpr $file

done

exit0

解析:打印當前目錄中所有以字母f開頭的腳本文件。for的參數來着$()中的命令的輸出結果,shell擴展f*.sh給出所有匹配此模式的文件的名字。此例中可能會報錯lpr: error - scheduler not responding!這是vim配置問題。

 

Ø while 語句。語法格式: while condition do

                                 Statements

                           Done

例:#!/bin/sh

   foo=1

   whlie [ "$foo" -le 20 ]

   do 

      echo "Here we go again"

      foo=$(($foo+1))

   done

   exit 0

解析:測試foo的值,如果它小於20就執行循環體,-le表示小於。

算表達式的使用: count=1

                 count=$[${count} + 1] 變量加1

 

Ø until語句。語法格式:until condition

                         do

                           Statements

                         Done

  它與while循環很相似,只是把條件測試反過來,循環將執行直達條件為真為止,而不是條件為真時反復執行。

 

Ø case 語句。語法格式case variable in

                       pattern statements;;

                       pattern statements;;

                       ...

                       esac 

 注意,每個模式行都以雙分號結尾。

例:#!/bin/sh

    echo "Is it morning?Please answer yes or no"

    read timeofday

    case "$timeofday" in

         yes|y|Yes|YES) 

                  echo "Good morning"

                  echo  "Up bright and early this morning"

                   ;;

      n*|N*) echo "Good afternoon";;

      *)   echo "Sorry ,answer not recognized";;

    esac

 

exit 0

解析:case語句被執行時,會把timeofday的內容與各個字符串依次進行比較。一旦某個字符串輸入匹配成功,case命令就會執行緊隨右括號后面的代碼。case命令會對用來做比較的字符串就行正常的通配符擴展,因此可以指定字符串的一部分在其后加上*通配符,如n*;只使用一個單獨的*表示匹配任何可能的字符串。

 

三、函數

1、函數的定義。我們只需簡單的寫出它的名字,然后是一對空括號,再把有關的語句放在一對花括號中,如:function_name () {

                                  Statements

                                 }

例:#!/bin./sh

foo () {

       echo "Function foo is executing"

  }

echo"script starting"

foo

echo "script ended"

exit 0

 

運行結果如下: script starting 

               Function foo is executing

               script ended

 

解析:當遇到foo()結構時,它知道定義了一個名為foo的函數。當執行到foo行時,shell就知道應該去執行剛才定義的函數。

注:在調用一個函數之前必須先對它進行定義。

 

四、命令

Ø break 命令。終止循環

Ø :命令。冒號(:)命令是一個空命令。它偶爾會被用於簡化條件邏輯,相當於true的一個別名。由於它是內置命令,所以它運行的比true快,但它的輸出可讀性較差。 

Ø continue命令。使for、while或until循環跳到下一次循環繼續執行。continue可以帶一個可選的參數以表示希望繼續執行的循環嵌套層數,也就是說你可以部分的跳出嵌套循環。

Ø .命令。點(.)命令用來執行當前shell中的命令。

Ø  echo命令。使用echo命令來輸出結尾帶有換行符的字符串。 常用 echo -n來去掉換行符。

Ø eval命令。eval命令允許你對參數進行求值,有點像一個額外的$。

Ø exec命令。將當前shell替換為一個不同的程序,腳本程序中exec命令后面的代碼都不會執行。

Ø exit n命令。exit命令使腳本程序以退出碼n結束運行。,退出碼0表示成功,退出碼1~125是腳本程序使用的錯誤代碼。

Ø export命令。export命令將作為它參數的變量導出到子shell中,並使之在子shell中有效。在默認情況下,在一個shell中被創建的變量在這個shell調用的下級(子)shell中是不可用的。export命令把自己的參數創建為一個環境變量,而這個環境變量可以被其他腳本和當前程序調用的程序看見。

例:腳本export 2                      

       

   腳本export1

 

第一個空行的出現是因為變量foo在export2中不可用,所以$foo被賦值為空,echo一個空變量將輸出一個空行。Bar用export聲明后在export1中仍然有效。

Ø expr命令。expr命令將它的參數當作一個表達式來求值。

Ø printf命令。語法:printf “format string” paremeter1 paremeter2

它支持的轉義序列:

 

Ø return命令。return命令的作用是使函數返回。

Ø set命令。set命令的作用是為shell設置參數變量。還可以通過set命令和它的參數來控制shell的執行方式。其中最常用的命令格式是set -x,它讓一個腳本程序跟蹤顯示它當前執行的命令。

Ø shift命令。shift命令把所有參數變量左移一個位置,使$2變成$1,$3變成$2,依此類推。

Ø trap命令。用於指定在接收到信號后將要采取的行動。trap命令的參數分為兩部分,前一部分是接收到指定信號時將要采取的行動,后一部分是要處理的信號名,trap command signal。

Ø unset命令。unset命令的作用是從環境中刪除變量或函數。

Ø find 命令。查找文件的功能。語法格式:find [path] [option] [tests] [actions] 

一些常用的選項:

 

 

測試部分,可以提供給find命令的測試非常多,每種測試返回的結果有兩種可能:true或false。find命令開始工作時,它按照順序將定義的每種測試依次應用到它搜索到的每個文件上。

 

 

我們還可以用操作符來組合測試。大多數操作符有兩種格式:短格式和長格式,

 

常見的動作:

 

 

Ø grep命令。使用grep命令在文件中搜索字符串。grep語法格式:grep[option] pattern [FILES] 如果沒有文件名,則搜索標准輸入。

grep命令的一些主要選項:

 

 

五、正則表達式

特殊字符:

 

如果你想將上述字符用作普通字符,就需要在它們前面加上\字符。所以,如果你想使用$字符,只需要簡單的將它寫為\$。 

在方括號中還可以使用一些有用的特殊匹配模式,

 

 

匹配字符:

 

 

跟蹤腳本程序中復雜錯誤的主要方法是設置各種shell選項。為了完成這一任務,你可以在調用shell時加上命令行選項,各種shell選項:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM