Linux之Shell腳本編程(一)


什么是Shell

  Shell是命令解釋器(command interpreter),是Unix操作系統的用戶接口,程序從用戶接口得到輸入信息,shell將用戶程序及其輸入翻譯成操作系統內核(kernel)能夠識別的指令,並且操作系統內核執行完將返回的輸出通過shell再呈現給用戶,下圖所示用戶、shell和操作系統的關系:

 

  Shell也是一門編程語言,即shell腳本,shell是解釋執行的腳本語言,可直接調用linux命令。 .java -> .class

  一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell,不同的shell可能支持的命令語法是不相同的。

 

Shell種類

  操作系統內核(kernel)與shell是獨立的套件,而且都可被替換。不同的操作系統使用不同的shell;同一個kernel之上可以使用不同的shell。

  常見的shell分為兩大主流:

  sh

    Bourne shell(sh) ,Solaris,hpux默認shell

    Bourne again shell(bash) ,Linux系統默認shell

  csh

    C shell(csh)

    tc shell(tcsh)

 

查看使用Shell

 

 

Shell環境定義

臨時環境變量

  所謂臨時變量是指在用戶在當前登陸環境生效的變量,用戶登陸系統后,直接在命令行上定義的環境變量便只能在當前的登陸環境中使用。當退出系統后,環境變量將不能下次登陸時繼續使用。

將環境變量永久生效

  通過將環境變量定義寫入到配置文件中,用戶每次登陸時系統自動定義,則無需再到命令行重新定義。定義環境變量的常見配置文件如下:

    /etc/profile  針對系統所有用戶生效,此文件應用於所有用戶每次登陸系統時的環境變量定義

    $HOME_name/.bash_profile  針對特定用戶生效,$HOME為用戶的宿主目錄,當用戶登陸系統后,首先繼承/etc/profile文件中的定義,

  再應用$HOME/.bash_profile文件中的定義。

系統預定義的環境變量

  系統環境變量對所有用戶有效,如:$PATH、$HOME、$SHELL、$PWD等等,如下用echo命令打印上述的系統環境變量:

 

 

 

shell腳本編程

  同傳統的編程語言一樣,shell提供了很多特性,這些特性可以使你的shell腳本編程更為有用。

創建Shell腳本

  一個shell腳本通常包含如下部分:

  首行

    第一行內容在腳本的首行左側,表示腳本將要調用的shell解釋器,內容如下:

    #!/bin/bash

    #!符號能夠被內核識別成是一個腳本的開始,這一行必須位於腳本的首行,/bin/bash是bash程序的絕對路徑,在這里表示后續的內容將通過bash程序解釋執行。

  注釋

    注釋符號# 放在需注釋內容的前面,如下:

  內容

    可執行內容和shell結構

 

 

Shell腳本的權限

  一般情況下,默認創建的腳本是沒有執行權限的。

  沒有權限不能執行,需要賦予可執行權限。

 

 

Shell腳本的執行

  1,輸入腳本的絕對路徑或相對路徑

    /root/helloWorld.sh

    ./helloWorld.sh

  2,bash或sh +腳本

    bash /root/helloWorld.sh

    sh helloWorld.sh

    注:當腳本沒有x權限時,root和文件所有者通過該方式可以正常執行。

  3,在腳本的路徑前再加". " 或source

    source /root/helloWorld.sh

    . ./helloWorld.sh

  區別:第一種和第二種會新開一個bash,不同bash中的變量無法共享。但是使用. ./腳本.sh 這種方式是在同一個shell里面執行的。

 

Shell變量

  變量:是shell傳遞數據的一種方式,用來代表每個取值的符號名。當shell腳本需要保存一些信息時,如一個文件名或是一個數字,就把它存放在一個變量中。

變量設置規則:

  1,變量名稱可以由字母,數字和下划線組成,但是不能以數字開頭,環境變量名建議大寫,便於區分。

  2,在bash中,變量的默認類型都是字符串型,如果要進行數值運算,則必須指定變量類型為數值型。

  3,變量用等號連接值,等號左右兩側不能有空格。

  4,變量的值如果有空格,需要使用單引號或者雙引號包括。

變量分類

  Linux Shell中的變量分為用戶自定義變量,環境變量,位置參數變量和預定義變量。可以通過set命令查看系統中存在的所有變量。

  系統變量:保存和系統操作環境相關的數據。$HOME、$PWD、$SHELL、$USER等等

  位置參數變量:主要用來向腳本中傳遞參數或數據,變量名不能自定義,變量作用固定。

  預定義變量:是Bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的。

用戶自定義變量

  用戶自定義的變量由字母或下划線開頭,由字母,數字或下划線序列組成,並且大小寫字母意義不同,變量名長度沒有限制。

設置變量

  習慣上用大寫字母來命名變量。變量名以字母表示的字符開頭,不能用數字。

變量調用

  在使用變量時,要在變量名前加上前綴“$”.

  使用echo 命令查看變量值。eg:echo $A

變量賦值

  1,定義時賦值:

    變量=值      等號兩側不能有空格

    eg:

      STR="hello world"

      A=9 

  2, 將一個命令的執行結果賦給變量

    A=`ls -la` 反引號,運行里面的命令,並把結果返回給變量A

    A=$(ls -la) 等價於反引號

      eg:  aa=$((4+5))

        bb=`expr 4 + 5 `

  3,將一個變量賦給另一個變量

    eg : A=$STR

變量疊加

  eg:#aa=123

  eg:#cc="$aa"456

  eg:#dd=${aa}789

 

  單引號和雙引號的區別:

  現象:單引號里的內容會全部輸出,而雙引號里的內容會有變化

  原因:單引號會將所有特殊字符脫意

  NUM=10    

  SUM="$NUM hehe"     echo $SUM     輸出10 hehe

  SUM2='$NUM hehe'     echo $SUM2    輸出$NUM hehe

列出所有的變量

  set

刪除變量

  unset  NAME

    eg :

      # unset A 撤銷變量 A

      # readonly B=2 聲明靜態的變量 B=2 ,不能 unset

 

  用戶自定義的變量,作用域為當前的shell環境。

 

環境變量

 

  用戶自定義變量只在當前的shell中生效,而環境變量會在當前shell和其所有子shell中生效。如果把環境變量寫入相應的配置文件,那么這個環境變量就會在所有的shell中生效。

 

  export 變量名=變量值   申明變量

  作用域:當前shell以及所有的子shell。

 

位置參數變量

$n

n為數字,$0代表命令本身,$1-$9代表第一到第9個參數,

十以上的參數需要用大括號包含,如${10}。

$*

代表命令行中所有的參數,把所有的參數看成一個整體。以"$1 $2 … $n"的形式輸出所有參數

$@

代表命令行中的所有參數,把每個參數區分對待。以"$1" "$2" … "$n" 的形式輸出所有參數

$#

代表命令行中所有參數的個數。添加到shell的參數個數

  shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$# 的值減1,用於分別處理每個參數,移出去的參數不再可用

  $* 和 $@的區別

  1,$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號" "包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數;

  2,當它們被雙引號" "包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;

  3,"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。

  

 預定義變量

$? 

執行上一個命令的返回值   執行成功,返回0,執行失敗,返回非0(具體數字由命令決定)

$$

當前進程的進程號(PID),即當前腳本執行時生成的進程號

$!

后台運行的最后一個進程的進程號(PID),最近一個被放入后台執行的進程   &

 

read命令

  read [選項] 值

  read -p(提示語句) -n(字符個數) -t(等待時間,單位為秒) –s(隱藏輸入)  

    eg:

      read –t 30 –p “please input your name: ” NAME

      echo $NAME

      read –s –p “please input your age : ” AGE

      echo $AGE

      read –n 1 –p “please input your sex  [M/F]: ” GENDER

      echo $GENDER

 


免責聲明!

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



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