1. 程式人生 > >shell程式設計學習筆記(1)

shell程式設計學習筆記(1)

接觸到linux已經有2-3年了,一些基本的命令用的還算很熟,但一直沒有系統的對linux進行學習,可以說學的的很零散,遇到問題一般通過網路也能找到答案。

最近突然不忙了,想系統的學習一下shell程式設計。可以說對linux的熟悉離不開對shell的學習,而作為一個好的系統管理員,不能不懂shell程式設計。

shell程式設計不只是簡單的命令堆疊,它還提供了變數,控制結構(if/for/while);可以說它和python、perl、ruby等3大腳步語言一樣,但在一些本地的管理以及檔案操作上,能提供更多的靈活性。

本學習筆記主要記錄自己學習shell的過程,學習資料為《Shell 指令碼學習指南》。

入門

1一個簡單的指令碼

  最簡單的指令碼只需要一個命令,直接從終端輸入的一個命令可看出是最簡單的一個指令碼,如:ls,who等,ls列舉對應目錄下的各檔案,who列舉系統有哪些人在登陸。

2管道

  管道符‘|’可以在兩個命令之間建立管道(pipeline):一個命令的輸出,成為另一命令的輸入。如列舉某資料夾下資料夾加檔案的個數:

 ls /  |wc -l

'ls /'命令的結果作為‘wc -l’的輸入,wc(字數計算程式)可以計算行(line)、字數(word)、字元數(character),-l選項計算行數,從而計算出資料夾或檔案的個數。

3#!

  通常一個指令碼不止一兩個命令,它是一些命令的組合加一些控制結構等等,一般我們會將其寫入一個文字檔案裡面,然後用chmod +x 賦予其可執行的許可權,預設情況下會呼叫/bin/sh(標準的shell)副本來執行該程式。現在,一般的linux系統都不止一個直譯器,bash/csh/等。指定使用csh直譯器,可再其第一行加入:

#! /bin/csh -f

通常使用絕對路徑,避免找不到shell,下面則指定awk 直譯器:

#! /bin/awk -f

4命令與引數

  Shell最基本的工作是執行一些系統命令,命令與引數的關係:命令+空白(space鍵或tab鍵)+引數。如:

ls -l
cd /home

選項引數並不是必須的:ls命令不加‘-l'也可以執行,選項引數有兩種格式’-‘或’--‘
如ls -a等效於ls --all

可以使用分號(;)分隔同一行的多條命令:cd /home;mkdir emptydir

使用& 將命令放入後臺執行:gedit ~/.bashrc & 。這意味著shell不用等到該命令完成,就可以繼續執行下一個命令。

shell識別3種基本的命令:內建命令、shell函式、外部命令:

  • 內建命令:shell本身所執行的命令,如:cd用來改變目錄,read接受使用者輸入,echo、printf列印資訊。
  • shell函式:用shell語言寫的完成特定功能的程式碼(命令集合+控制結構),shell函式和一般命令一樣使用。
  • 外部命令:由shell副本所執行的命令,過程如下:

        a.建立新的程序,即shell副本。

        b.新程序在PATH變數內列出目錄中,尋找特定命令。如果命令名稱中有’/‘符號,則略過路徑查詢。

        c.新程序中,以找到的新程式取代shell程式並執行。

        d.程式完成,最初的shell從終端或腳本里執行下一條命令。如下圖所示:

5變數

  指令碼語言的變數使用都非常方便,下面是一個變數的應用:

myvar=this_is_a_var
echo $myvar
yourvar="this is your var"
echo $yourvar

 

當變數賦值有空格時需要用“”將其括起來,使用$符號進行變數的引用。

6列印資訊

  echo:簡單的文字輸出使用echo即可,很方便,上面已經演示過它的使用了。複雜一點的列印可以用printf,它實現了C中printf函式類似的功能,如:

7重定向

  <:輸入重定向

  >:輸出重定向,如果檔案不存在,將新建一個,如果已經存在,將其覆蓋

  >>:附加到檔案,如果檔案不存在,將新建一個,如果已經存在,附加到檔案尾部

下面的命令使用重定向備份bashrc檔案:

8命令路徑查詢

  $PATH變數指明到哪些路徑下去查詢相關命令,如將本目錄加入可執行路徑:

PATH=$PATH:.

  '.'表示本目錄,'..'表示上一目錄。若要讓上述設定永久有效,可將上述設定加入~/.bashrc檔案尾。

9訪問shell指令碼引數

#! /bin/sh
echo the shell script is $0
ehco $1 this is your $2

將上述程式碼保持到文字檔案myecho,用chmod +x myecho賦予其可執行許可權,執行上述命令上述命令輸出為:

shell命令和引數直接用空白隔開,並且會依次存入$0、$1、$2等shell自動變數中,在指令碼中可用$0/$1等訪問相關引數。

10指令碼執行的跟蹤

  方式1:sh -x 指令碼;被跟蹤的指令碼前會有一個+號,此時指令碼內所有命令將被跟蹤,能快速定位出錯的程式段,其結果如下:

  方式2:在指令碼中使用set -x和set +x來開啟跟蹤和關閉跟蹤,這通常在大的指令碼中跟蹤某一段程式。將上述程式碼改為:

#! /bin/sh
set -x
echo the shell script is $0
set +x
echo $1 this is your $2

結果為:

set +x命令也被跟蹤到,因為跟蹤是在它執行完後才關閉,set -x不被跟蹤,set -x執行完後才會開啟跟蹤。