shell程式設計

来源:http://www.cnblogs.com/myhello-world/archive/2016/06/04/hi_laotou.html
-Advertisement-
Play Games

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  僅刪除變數

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介面定義: 實現: 以上兩種方式均可以實現簡單的均衡演算法,第一種我參考許多前輩的寫法,第二種屬於自己想的.從概率論的角度出發都可以滿足需求,而且兩者效率相當(我原以為第二種實現方式速度更快,很遺憾的是結果證明並非如此,可能是Random對象取隨機數比較慢,我理論上認為沒有鎖會更快的),我個人覺得方法 ...
  • Mysql的Root密碼忘記,查看或修改的解決方法:1.首先啟動命令行2.在命令行運行:taskkill /f /im mysqld-nt.exe3.繼續在命令行運行:mysqld-nt --skip-grant-tables4.新開一個命令行運行:mysql -u root (如果沒有配置mysq ...
  • 1. Linux中所以內容以文件形式保存,包括硬體,所以在用命令行配置文件時,該配置僅僅是臨時生效。 2. Linux不靠擴展名區分類型,而是靠文件許可權。之所以有擴展名是為了便於管理。 .rpm二進位軟體包 .html .php網頁文件 .sh腳本文件 .conf配置文件 3. Linux所有存儲設... ...
  • 最近心血來潮,想學Linux,所以根據網上的建議,買了鳥哥的書。為了以後學習方便,準備安裝CentOS7。準備好鏡像文件和U盤後,4號晚上八點多開始施工,本以為幾個小時就可以弄好的東西,第一次讓我明白了什麼叫理想與現實的差距。鑒於CentOS7安裝的繁瑣程度和鳥哥的火熱程度,我決定把我安裝的全過程寫 ...
  • 虛擬機的安裝0Snapshot和clone 系統分區(由硬碟的性能所限制的) 1分區類型: 主分區:最多有4個 擴展分區:最多只能有1個;主分區加擴展分區最多有4個;不能寫入數據,只能包含邏輯分區,不能格式化。 邏輯分區: 2格式化(目的:在硬碟當中寫入文件系統) 格式化(高級格式化)又稱邏輯格式化... ...
  • Linux實現中斷處理 內核是怎麼知道應用程式要調用系統調用的呢?或者說應用程式怎麼通知系統內核自己需要執行一個系統調用,這是通過軟中斷實現的,通過引發一個異常來促使系統切換到內核態去執行異常處理程式 PS:什麼時候會從用戶態切換到內核態呢?1.中斷;2.陷阱;3.系統調用 中斷分為兩種,硬中斷和軟 ...
  • 在電腦網路普及的初期,很多OS系統都使用的為單網卡方式,即一個網卡使用一個IP地址。隨著網路要求的不斷提高,我們可以對多個網卡進行綁定聚合當一個邏輯網路介面來使用,從而大幅提升伺服器的網路吞吐(I/O),同時也可以根據不同的場景和需求來設置其綁定模式。本文簡要描述一下其配置過程。 1. 編輯ifc ...
  • CentOS 之 Supervisor supervisor是一個Linux上用來管理程式後臺運行的工具,支持程式的自啟動,掛掉重啟,日誌等功能。可配置程式隨系統啟動,並支持掛掉重啟,增強程式穩定性。 本文檔針對CentOS,也是我搭環境記錄的筆記,其他系統可以參考最下麵的參考資料。 安裝Super ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...