linux下shell腳本把編程基礎,shell腳本是linux一個用戶和系統間介面的程式,它允許用戶向操作系統輸入需要執行的命令。 ...
1.shell腳本的基本概念:
(1)Shell執行的是稱為shell程式,這些程式通常被稱為腳本。
(2)Shell是一個用戶和系統間介面的程式,它允許用戶向操作系統輸入需要執行的命令。
(3)shell包含bash和csh以及其他程式圍繞在linux內核的四周。(圖1-1)
(4)在linux大多數發行版中,預設的shell程式/bin/sh實際上是對程式/bin/bash的一個鏈接。
圖 1-1
2.管道和重定向
2.1重定向輸入和輸出
Eg:ls -1 > 1.txt
說明:
使用<和>對輸入和輸出進行重定向。文件描述符0代表一個程式的標準輸入,1代表標準輸出,2代表錯誤輸出。
你可以使用>>操作符將輸出的內容附加到原有內容之後。
Eg: ps >> 1.txt
下麵的命令將把標準輸出和標準錯誤輸出分別重定向到不同的文件中。
Eg:kill -HUP 1234 >killout.txt 2>killerr.txt
用>&操作符來結合兩個輸出。
Eg:Kill -l 1234 >killouterr.txt 2>&1
Tip:返回碼一般保存在linux通用“回收站”/dev/null來丟棄所有的輸出信息。
Eg: Kill -l 1234 >/dev/null 2>&1
重定向標準輸入。
Eg:More <killout.txt
More可以接受文件名作為參數。
2.2管道
用管道操作符|來鏈接進程。在linux下通過管道鏈接的進程可以同時運行,並且隨著數據流在它們之間的傳遞可以自動地協調。
Eg: Ps > psout.txt Sort psout.txt > pssort.out
可以由一個命令解決: Ps | sort > pssort.out
3.作為程式設計語言
在命令行上直接輸入shell腳本是一種測試短小代碼段的簡單而快捷的方式。
Eg:
$For file in *
>Do
>If grep -l POSIX $file
>Then
>More $file
>Fi
>done
當shell期待進一步的輸入時,正常的$shell提示符將改變為>提示符。你可以一直輸入下去,由shell
來判斷何時輸入完畢並立刻執行腳本程式。 Shell還提供了通配符擴展可以(globbing)。可以用通
配符*來匹配一個字元串,也可以用通配符?來匹配單個字元,而[set]允許匹配方括弧中任何一個單
字元,[^set]對方括弧中的內容取返,即匹配任何沒有出現在給出的字元集中的字元。擴展的花括弧
{}(只能用在部分shell中,其中包含shell)允許你將任意的字元串放在一個集合中,已供shell擴展。
Eg:
Ls my_{finger,toe}s
這個命令將列出my_fingers和my_toe,它使用shell來檢查當前目錄下的每個文件。
3.1創建腳本
Eg:
#!/bin/sh
#first
#This file look through all the files in the current
#directory for the string POSIX,and then pringts the names of
#those files to the standard output
For file in *
Do
If grep -q POSIX $file
Then
Echo $file
Fi
Done
Exit 0
程式中的註釋以#符號開始,一直持續到該行結束。請註意第一行#/bin/sh,它是一種特殊形式的註釋,
#!字元告訴系統同一行上緊跟在它後面的那個參數是用來執行本文件的程式。 因為腳本程式本質上被
看作是shell的標準輸入,所以它可以包含任何能夠通過你的PATH環境變數引用的linux命令。
3.2..把腳本設置為可執行 運行腳本有兩種方法。
比較簡單一點的方法是調用shell,並把腳本文件名當成一個參數,
eg: /bin/sh first
另一種:
Eg: Chmod +x first ./first
如果直接調用first可能會列印未找到命令。這種情況很可能發生,因為shell環境變數PATH並沒有設置
為當前目錄下查找要執行的命令。要解決這個問題,一種是輸入PATH=$PATH:.或編輯你的.bash_profile
文件,將剛纔這條命令添加到文件的末尾。./first的作用是把腳本程式的完整的相對路徑告訴shell。
4shell的語法
4.1變數 在shell里,使用變數之前通常並不需要事先為它們作出聲明。你只是通過使用 它們來創建它們。
在預設情況下,所有變數都被看做字元串並以字元串來存儲,即使它們被賦值為數值時也是如此。Shell
和一些工具程式會在需要時把數值型字元串轉化為對應的數值以對它們進行操作。 在shell中,你可以通
過在變數名前加一個$符號來訪問它的內容。當你為變數賦值時,你只需要使用變數名,該變數會根據需
要自動創建。
4.1.1使用引號 一般情況下,腳本文件中的參數包含空白字元分隔(列如,一個空格、一個製表符或者一個換行符)。
如果你想在一個參數中包含一個或多個空白字元,你就必須給參數加上引號。 如果你把一個$變數表達式放在雙引號中,
程式執行到這一行時就會把變數替換為它的值; 如果你把它放在單引號中,就不會發生替換現象。你還可以通過在$字元
前面加上一個\字元取消它的特殊含義。
Eg:
#!/bin/sh
Myvar=”Hi there”
Echo $myvar
Echo “$myvar”
Echo ‘$myvar’
Echo \$myvar
Echo enter some text Read myvar
Echo ‘$myvar’ now equals $myvar
Exit 0
4.1.2環境變數
當一個shell腳本程式開始執行時,一些變數會根據環境設置中的值進行初始化。這些變數通常用大寫字母做名字。
具體創建的變數取決於你的個人配置。參見表4-1。
4.1.3參數變數
如果腳本程式在調用時帶有參數,一些額外的變數就會被創建。即使沒有傳遞任何參數,環境變數$#也依
然存在,只不過它的值是0罷了。參見表4-2。
4.2 條件
Test或[命令
在實際工作中,大多數腳本程式都會廣泛使用shell的布爾判斷命令或[或test。為了增強可讀性,當使用[命令時,
我們還使用符號]來結尾。
Eg:
If test -f fred.c
Then
...
Fi
也可以寫成:
If [ -f fred.c ]
Then
...
Fi
Tip:必須在[符號和被檢查的條件之間留出空格。
Test命令可以使用的條件類型分3類:
(1)字元串比較
(2)算術比較
(3)文件有關的條件測試
4.2.1 控制結構 if語句
Eg:
If condition
Then
Statements
Else
Statements
Fi
elif語句:
Eg:
If condition
Then
Statements
Elif
Statements
Else
Statements
Fi
for語句
For variable in value
Do
statements
Done
While語句
While condition
do
Statements
Done
Until語句
Untilcondition
Do
Statements
Done
case語句
Case variable in
Pattern [ | pattern] ...) statements;;
Pattern [ | pattern] ...) statements;;
...
Esac
命令列表 AND列表
語法: Statements1 && Statements2 && Statements3 && ...
從左開始執行每條命令,如果前一條命令返回的是true,右邊的下一條命令才能夠執行。AND作為一個整體,只有在
列表中的所有命令都執行成功時,才算它執行成功,否則就算它失敗。
OR列表 語法:
Statements1 || Statements2 || Statements3 || ...
從左開始順序執行每條命令。如果前一條命令返回的是false,它右邊的下一條命令才能夠被執行。 語句塊 某些地方
只允許使用單個語句的地方(比如在AND或OR列表中)使用多條語句,可以把它們括在{}中來構造一個語句塊。
Eg:
Get_confirm && {
Grep -v “$cdcatnum” $tracks_file > $temp_file
Cat $temp_file > $tracks_file
Echo Add_record_tracks
}
函數 定義shell函數:
Function_name ()
{
statements
}
你可以通過return命令讓函數返回數字值。
Foo ()
{
echo JAY;
}
...
Result=”$(foo)”
你也可以使用local關鍵字在shell函數中聲明局部變數。
2、文件內容行之間的排序 Shell代碼
#!/bin/bash
sort -t= +4
文件
備註:“=”表示按=號進行切割(註意:只能是單個字元),“+4”表示按第五個項進行排序。
更多參數:
-r 表示降序排序
-n 表示按數字大小排序
-k 表示根據那個欄位排序,4.1,表示第4列第一個字元開始 ,5表示到第5個欄位為結束
-t 後面跟分隔符,預設是空格
例如:sort -r -n -k4.1,5 功能說明:刪除變數或函數。
語法:unset [-fv][變數或函數名稱]
補充說明:unset為shell內建指令,可刪除變數或函數。
參數:
-f 僅刪除函數。
-v 僅刪除變數