linux shell 程式設計

2021-06-29 02:08:26 字數 3873 閱讀 8125

1 程式設計入門-----shell的簡介。

從程式設計師的角度來看, shell本身是一種用c語言編寫的程式,從使用者的角度來看,shell是使用者與linux作業系統溝通的橋梁。使用者既可以輸入命令執行,又可以利用 shell指令碼程式設計,完成更加複雜的操作。在linux gui日益完善的今天,在系統管理等領域,shell程式設計仍然起著不可忽視的作用。深入地了解和熟練地掌握shell程式設計,是每乙個linux使用者的必修功課之一。

linux的shell種類眾多,常見的有:bourne shell(/usr/bin/sh或/bin/sh)、bourne again shell(/bin/bash)、c shell(/usr/bin/csh)、k shell(/usr/bin/ksh)、shell for root(/sbin/sh),等等。不同的shell語言的語法有所不同,所以不能交換使用。每種shell都有其特色之處,基本上,掌握其中任何一種就足夠了。在本文中,我們關注的重點是bash,也就是bourne again shell,由於易用和免費,bash在日常工作中被廣泛使用;同時,bash也是大多數linux系統預設的shell。在一般情況下,人們並不區分 bourne shell和bourne again shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。

利用vi等文字編輯器編寫shell指令碼的格式是固定的,如下:

#!/bin/sh

#comments

your commands go here

首行中的符號#!告訴系統其後路徑所指定的程式即是解釋此指令碼檔案的shell程式。如果首行沒有這句話,在執行指令碼檔案的時候,將會出現錯誤。後續的部分就是主程式,shell指令碼像高階語言一樣,也有變數賦值,也有控制語句。除第一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合併為同一行。

#號開頭的語句是注視行。與c程式設計中的//一樣。

編輯完畢,將指令碼存檔為filename.sh,檔名字尾sh表明這是乙個bash指令碼檔案。執行指令碼的時候,要先將指令碼檔案的屬性改為可執行的:

chmod +x filename.sh

執行指令碼的方法是:

./filename.sh

下面我們從經典的「hello world」入手,看一看最簡單的shell指令碼的模樣。

#!/bin/sh

#print hello world in the console window

a = "hello world"

echo $a

2 shell 程式設計 對變數的賦值。

shell對變數的賦值,所有的變數都是由字串組成,不需要對變數名預先宣告,而且有很多關鍵字供程式設計者使用。下面列舉例子詳細說明。 在終端下建立檔案 #vi s2.sh

#!/bin/sh

#set a variable a

a="hello world"

#print a

echo "a is :"

echo $a

在這個程式當中,可以看到shell程式設計與c程式設計的區別,沒有那麼嚴格的語法,在每句不需要加「;」,

而且在shell中引用變數的時候前面加「$」。

2.1 當變數名與其他文字混淆的時候,需要加「{}」

#!/bin/sh

# set a variable num

num=2

echo "the variable num is $numnd"

執行程式後,答案並不是 the variable num is 2nd,而是什麼都沒有輸出。因為bash會尋找numnd變數,但是並沒有給這個變數賦值。所以將程式改為:

echo "the variable num is nd"

2.2 預設變數

$#:傳入指令碼的命令列引數個數

$*:所有命令列的引數值,而且各個引數值之間有空格表示

$0:命令本身,就是要執行的shell檔名

$1:第乙個命令列引數

$2:第二個命令列引數

$3$4

example:

#!/bin/sh

echo "number of vars:"$#

echo "number of vars:"$0

echo "number of vars:"$*

echo "number of vars:"$1

echo "number of vars:"$2

echo "number of vars:"$3

執行./file 11 22 33

輸出結果:

3file

11 22 33

1122

332.3區域性變數

在變數首次賦值是加關鍵字local可以宣告為區域性變數。

#!/bin/sh

hello="aa"

echo $hello

function fucn1

func1

echo $hello

可以看看結果是?

3 if 語句

if語句在bash中的格式:

if [expression]

then

#code block

else if[expression]

then

#code block

else

#code block

fifi

example:

#!bin/sh

filename=

echo "input the file name:"

read filename

if[-c "filename"]

then

cp $filename/dev

fi此程式的功能是判斷輸入的file name是不是字元裝置檔案,如果是,則copy到/dev目錄下。

有關if 的引數有很多,不一一列出。

4 for 迴圈語句

for var in [list] do

#code block

done

其中var是迴圈控制變數,[list]是var需要遍歷的乙個集合。do/done包含了迴圈體,相當於c語言中的{},形式也可以寫成 for var in [list] ;do

example:

#!bin/sh

for day in sun mon tue wed thr fri sat

doecho $day

done

如果列表被安排在「」中,則認為是乙個元素,即會是乙個元素。

編寫shell程式,實習計算目錄下的檔案數。

5 while 迴圈

while[condition] do

#code block

done

編寫 將使用者輸入的數按倒序方式輸出。

until 迴圈語句與while語句相似,只是執行條件相反了。

6 case 語句

case "$var" in

condition 1)

#code blcok ;;

condition 2)

#code block ;;

condition n)

#code block;; *)

defaults members;;

esac

#!bin/sh

case"$1"in

'start')

/usr/sbin/apachect1 start ;;

'stop')

/usr/sbin/apachect1 stop ;;

'restart')

/usr/sbin/apachet1 restart ;;

*)echo "usage $0 start|stop|restart"  ;;

esac

此程式的作用是開啟關閉http服務。

linux shell 程式設計

bin bash comments your commands go here 首行中的符號 告訴系統其後路徑所指定的程式bash即是解釋此指令碼檔案的shell程式。除第一行外,以 開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上 這個符號表明下一行與此行會合併為同一行。有環境變...

Linux Shell 程式設計

檔案描述 shell 代號 dev stdin 標準輸入,一般指的是鍵盤輸入 dev stdout 標準輸出,一般指終端顯示器 dev stderr 標準錯誤,一般指終端顯示器 l輸出重定向 l輸入重定向 l追加重定向 l錯誤重定向 2 l輸出和錯誤同時重定向 應用例子 1.將 ls的結果輸出到檔案...

Linux Shell程式設計

linux的shell程式設計 history 用來檢視命令歷史的 也可以用!表示 預設的命令歷史有1000條 history相關的小技巧,就和!有關係 上一條命令的最後一條引數 555 在命令歷史裡面,執行第555條命令 vi 命令歷史裡從上往下看,最近的用到了vi的命令 tab鍵可以補全檔案路徑...