Linux Shell程式設計

2022-04-03 17:50:28 字數 3993 閱讀 8828

在linux系統中,我們一般都是用c語言寫服務端程式,但是一般我們不直接啟動這個程式,而是通過乙個shell指令碼啟動和關閉(需要設定一些環境變數和防止開啟多個改程式,開啟多個後需要找到pid才能關閉)

那麼shell是什麼呢?

說白了shell是作業系統提供給我們的一種語言,用來將使用者的命令輸送到核心中執行

1首先我新建乙個test2.sh,存放下面的一段shell**

2儲存後,修改這個shell為可執行檔案 chmod +x test2.sh

#! /bin/sh

#定義變數

name=張三

echo $name

echo

"引數:$*

"echo

"引數個數$#

"

輸出結果:

下面分別介紹欄位的含義

第一行:一般預設第一行都是上面這段#! /bin/sh,通知系統用/bin/sh來執行下面的程式。

以「#」開頭的行代表注釋

echo代表輸出後面一段話的到使用者介面

$name代表使用了name這個變數(定義shell變數在下面介紹)

$* 代表所有的引數(我們在shell命令後面加了hello 和world兩個引數)

$#代表引數的個數

有了初步的認識,我們就開始踏入shell程式設計吧!

定義shell變數:(注意等號左邊右邊不可以有空格)

shellname=value

使用shell變數

$shellname

代表第幾個引數

例如$1代表第乙個引數,按照上面的**就是hello

還有下面的一些$符號的使用。

可能會對$?有一點費解,例如我們在shell中呼叫了乙個c語言程式mydemo,其中mydemo這個主函式會返回100(這裡不寫c**了)

#! /bin/sh

./mydemo

echo $?

shell輸出值:100

也可以是執行一段shell函式,獲取該函式的返回值(最後講函式說到)

如果我們想在shell中執行一段命令,並將該命令的值存放到乙個變數中,就要用到` `符號(在1數字旁邊)

#! /bin/sh

result=`ls`

echo result=$result

ls命令顯示當前資料夾下有哪些檔案

輸出結果:result=test.sh ...

我們在執行shell的時候,可能需要我們輸入一些資料,除了帶引數的方式我們還可以使用read進行讀

#! /bin/sh

echo

"please enter a

"read a

echo

"please enter b

"read b

echo

"a=$a,b=$b

"

輸出結果:

read命令讀取乙個輸入行,直至遇到換行符。

行尾的換行符在讀入時將被轉換成乙個空字元

如果read命令後有變數名,輸入內容賦給該變數。

如果read命令後未跟變數名,讀入的行將被賦值給內建變數reply。

shell也會像高階語言支援if,while等計算

格式:(fi代表這個if結束)

if

(test condition) then

commands

else

commands

fi

test是乙個固定關鍵字,用來判斷condition的描述是否正確

#! /bin/sh

if (test "

start

" = "$"

) then

echo

"start

"else

echo

"end

"fi

執行結果:

格式:

if [ -option file]; then

commands

else

commands

fi

**:

#! /bin/sh

if [ -d "$"

]; then

echo exist

else

echo notexist

fi

執行

檢視dir1資料夾是否存在,因為我建立了乙個,所以是存在的。

其中還有一些其他選項

**格式:([右邊和]左邊都要有乙個空格哦,done代表迴圈結束,當條件不成立時候迴圈結束)

while

[ expr ];

docommands

done

**demo(大家可以自己驗證哈)

#! /bin/sh

tmp=0

while [ "

$tmp

" != "5"

];do

echo

"curtmp=$tmp

"tmp=$[ $tmp + 1

]done

同樣也支援像switch那樣的分支選擇語句的

**格式:(如果有乙個pattern匹配到跟string內容一樣,執行這裡面的內容,否則執行最下面的*分支,;;兩個分號代表退出case迴圈,跟c語言的break)

case

"string"in

pattern_1)

commands

;;pattern_2)

commands

;;*)

commands

;;esac

**格式:(會遍歷這個list陣列,將當前值存放到varname變數中,後面的分號也是必不可少的哦

for varname in

list ;

docommands

done

**demo

#! /bin/sh

for name in $*;

doecho

"$name

"done

上面的**會輸出所有的引數。

跟c語言的exit很類似,代表退出當前shell

**格式:(code代表退出碼)

exit code
可以在乙個ashell中呼叫另乙個bshell,可以在ashell通過$?得到bshellexit退出嗎

shell同樣也是支援函式的哈

**格式:(使用前必須先定義函式)

function funcname

**demo:

#! /bin/sh

function fun1

fun1 34

echo

"函式返回值:$?

"

上面**輸出什麼大家應該知道了。可以再驗證一下

最後寫乙個demo,代表開啟某個程序(如果已經開啟就不再重複開啟)

#! /bin/sh

me=`whoami`

pid=`ps -u $me |grep mydemo|awk `

if( test "

$pid

" = ""

) then

`mydemo`

fi

pid的變數用來獲取mydemo的pid值,

grep代表搜尋mydemo這個程序

awd標識輸出這一行的第一列,也就是pid的值

大家可以了解一下ps,grep,awk命令哈

linux shell 程式設計

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

linux shell 程式設計

1 程式設計入門 shell的簡介。從程式設計師的角度來看,shell本身是一種用c語言編寫的程式,從使用者的角度來看,shell是使用者與linux作業系統溝通的橋梁。使用者既可以輸入命令執行,又可以利用 shell指令碼程式設計,完成更加複雜的操作。在linux gui日益完善的今天,在系統管理...

Linux Shell 程式設計

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