1. 程式人生 > >linux-shell指令碼知識點

linux-shell指令碼知識點

註釋

符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用/bin/sh來執行程式。(可以執行echo $SHELL來看你的系統是使用那一類shell, 比如ubuntu使用的是/bin/bash,則第一行寫成#!/bin/bash
當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。 要使指令碼可執行: 編譯 chmod +x filename 這樣才能用./filename 來執行 .

美元符號的用法

運算子 解釋
$0 shell的命令本身(包括完整路徑)
19 數字表示shell 的第幾個引數
$# 傳遞到指令碼的引數個數
$* 以一個單字串顯示所有向指令碼傳遞的引數
$! 後臺執行的最後一個程序的ID號
@|*相同
$- 顯示shell使用的當前選項。
$? 顯示最後命令的執行狀況。0表示沒有錯誤。
$$ 指令碼執行的ID號

變數

在shell程式設計中,所有的變數都由字串組成,並且不需要對變數進行宣告,例如:

```
temp="abc" #注意=前後不能有空格,否則變數值會被認為是一個命令
echo $temp; #變數在賦值時不需要加$符號,但是在呼叫時,需要加$符號。
echo {$temp}qwe;#當變數名與符號串連線在一起時,為了使其不被混淆,需要在變數周圍加一對大括號。

```

管道,重定向和反短斜線

管道 (|) 將一個命令的輸出作為另外一個命令的輸入.
例如:

``` 
find -name"temp" |wc -l#即將find命令的輸出作為wc命令輸入,來統計當前目錄下檔名包含temp的檔案的個數
```

 重定向:將命令的結果輸出到檔案,而不是標準輸出(螢幕)
 
1. >寫入檔案並覆蓋舊檔案
2. >> 加到檔案的尾部,保留舊檔案內容。
3. /dev/null 代表空裝置檔案

> 代表重定向到哪裡,例如:echo "123" > /home/
123.txt 1 表示stdout標準輸出,系統預設值是1,所以">/dev/null"等同於"1>/dev/null" 2 表示stderr標準錯誤 & 表示等同於的意思,2>&1,表示2的輸出重定向等同於1 1>/dev/null 首先表示標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,說白了就是不顯示任何資訊。 2>&1 接著,標準錯誤輸出重定向等同於 標準輸出,因為之前標準輸出已經重定向到了空裝置檔案,所以標準錯誤輸出也重定向到空裝置檔案。

反短斜線:使用反短斜線( ` )可以將一個命令的輸出作為另外一個命令的一個命令列引數。
例如

     ftype=`file "$1"`  #將輸入的第一個引數的檔案資訊賦值給ftype變數

流程控制

  1. if
    語法為:

    if   ....; then 
         .... 
    elif ....; then 
        .... 
    else 
        .... 
    fi   
    
    
    #!/bin/sh
    
    ftype=`file "$1"`
    case "$ftype" in
    "$1: Zip archive"*)
      unzip "$1" ;;
    "$1: gzip compressed"*)
      gunzip "$1" ;;
    "$1: bzip2 compressed"*)
      bunzip2 "$1" ;;
    *) echo "File $1 can not be uncompressed with smartzip";;
    esac
  2. selsect

    select var in ... ; do 
     break 
    done 
    
    #!/bin/sh
    
    echo "What is your favourite OS?"
    select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
        break
    done
    echo "You have selected $var"
  3. while

    while ...; do 
    .... 
    done 
    i=1
    while(test $i -lt 20)
    do
         echo $i
    done
    
  4. for

    for var in ....; do 
      .... 
    done 
    
    
    #!/bin/sh
    
    for var in A B C ; do
      echo "var is $var"
    done

引號

雙引號防止萬用字元擴充套件
單引號防止萬用字元和變數擴充套件
使用轉移字元也可以防止擴充套件

herdoc

comment string <<<
body
string;

注意

  • <<<End開始標記開始,以End結束標記結束,結束標記必須頂頭寫,不能有縮排和空格,且在結束標記末尾要有分號。開始標記和開始標記相同,比如常用大寫的EOT、EOD、EOF來表示,但是不只限於那幾個,只要保證開始標記和結束標記不在正文出現即可。

  • 位於開始標記和結束標記之間的變數可以被正常解析,但是函式則不可以。

  • heredoc常用在輸出包含大量HTML語法d文件的時候。比如:函式outputhtml()要輸出HTML的主頁。可以有兩種寫法。很明顯第二種寫法比較簡單和易於閱讀。