shell程式設計的核心內容

2021-04-29 23:36:06 字數 3568 閱讀 4676

很多linux

的初學者以前可能用過很多

dos的命令,對

shell

這種命令式的程式語言略知一二,但並沒有接觸很多

shell

的用法,沒能真正抓住這種強大的程式語言的內涵,在這編文章裡,我們用簡短的篇幅使

linux

學習者掌握這門語言。

在這篇文章裡,我們不會關注shell

每個命令的具體用法,因為這些在網上查是完全可以搜尋出來的,有很多資料可以參考,我們會通過例項直抵

shell

的真諦,關注它的控制結構和條件測試,以及函式和變數的用法。

shell英文直譯過來是「殼」,是一種介於作業系統和使用者之間的一種特殊的應用程式。常見的

shell

有:bourne shell (sh)

、korn shell(ksh)

、c shell (csh)

、bourne again shell(bash)

等。我們通常用的是bash

。試想,乙個shell

高手將會有機會進入

linux/dba

網路管理員這個高薪並充實的行業。所以,在學習前,你必須認為自己是個高手,有這樣的信心,才能學好。所以,我們先介紹乙個你可能沒有用過的命令

useradd

用以實現新增乙個新的使用者到你的系統中。

• useradd suojian

• mkdir /home/suojian

• chown suojian:users /home/suojian

• passwd suojian

• 這樣重啟虛擬機器就能用suojian

使用者登陸   

這樣照著做,你肯定能實現的,當然,前提是在root

使用者下。為什麼呢?

好多人總喜歡問為什麼?提出乙個問題,不是因為不動腦思考!

我認為,在linux

的世界遨遊,很多東西是沒有為什麼的,

gnu組織的一些東西就是規則(

the rules

)約束的。規則是很重要的東西,西方的「法制」明顯高於「德製」。所以,在東方文明的中國大學裡,很多課程設定都並沒有介紹太多規則性的東西。我們本科畢業,肯定沒有學習過

shell

、perl

、還有makefile

,以及正規表示式的匹配。而這些是工業界老生常談的。

說的有點遠了,總結一下,就是告誡我們的學員以及所有linux

愛好者do as what it is!

在linux

的學習過程中,戒焦躁。

當然,上面的例子只是普通的乙個shell

指令碼,如果掌握了

linux

系統使用者和組的原理,就知道為什麼了。有興趣可以閱讀下

/etc/passwd

和/etc/group

兩個檔案。熟悉一下每位的函式,是用:隔開的。

shell

也提供了一組命令用以實現檔案、目錄及其許可權的管理。

shell的本質在於它的程式設計能力,它的程式就是各種命令的集合,其中也可以使用正規表示式的匹配。最關鍵的,我們要掌握它提供的特殊字元,變數的用法和各種條件選擇語句。

shell提供的特殊字元如下:

#:注釋,這些說明不會被當成命令的程式執行。在

/etc/zshrc

檔案中便能看到

&:以後臺方式執行。例如執行

find / -name –print 

&命令,會把這個程式放到後台執行

『:取代命令字元.例如:執行

alias dir=『ls-al』

,定義dir

成為ls-al

命令的別名

;:可用它將多個命令分隔開來,讓命令依次執行.

>:把執行結果輸入到乙個檔案中.若該檔案已經存在,則原有內容回被刪除.

#ls –al > dir.txt

>>

:把執行結果附加到乙個已存在的檔案後面.

#cat data.txt >> result.txt

|:建立管線,將乙個命令的執行結果輸入給下乙個命令使用||:

or運算,一般用於

if 、

while   

等條件語句判斷式中

~:使用者登入後所在的目錄,也就是使用者的家目錄.:

表示當前目錄

..:表示上一級目錄

當然,也包括下圖中的字元:

你可以通過如下幾個實驗驗證它的原理:

• $ cat 

arg.c

• main(int argc,char **argv)

• • 

$ gcc .c –o arg

• $ chmod u+x param; cat param

• #!/bin/sh

• echo $$

• echo $#

• echo」usage:$0 arg1 arg2…」

• ./arg 「$@」

• ./arg 「$*」

這樣我們用./param

後面跟些測試引數來看下程式的輸出:

• $ ./param 

tope is best

$home

• 19752• 4

• usage: ./param arg1 arg2 …

• 0:[./arg]

• 1:[

tope]• 

2:[is]• 

3:[best]• 

4:[/root]

• 0:[./arg]

• 1:[

tope is best

/root]

好了,如果你照著做了,相信你成功了,相信你也理解了這些特殊字元的涵義,我們不會停留在這些弱智的符號上面。

你肯定知道shell

的變數的概念,如果你知道

c語言的

int i.

但我在這裡想說的不是

shell

的普通變數。

我介紹一下shell

區域性變數和環境變數的概念和用法。我想這對你是有幫助的。區域性變數是所建立的

shell變數,

預設為區域性變數。環境變數

(全域性變數

)是在當前

shel

l下啟動的子程序只繼承環境變數不繼承區域性變數。如果你在shell

的終端下執行乙個

shell

的指令碼test.sh

,這樣test.sh

就派生乙個新的子程序,區域性變數是不會傳遞給這個子程序的,而環境變數能夠傳遞。

#vi test.sh

echo my name is $name

#name=suojian

定義區域性變數

#./test.sh

#export name

定義成環境變數

#./test.sh

這種變數的區別是shell

變數的支援核心所在!

好了,shell

的分支結構和條件測試下次再介紹。

shell程式設計的核心內容(2)

本篇文章緊接上篇shell程式設計核心內容 1 shell不僅僅是命令,很多情況,我們可以把它作為一種程式設計的工具,比如,用shell實現乙個學生資訊的管理系統。本文的寫作目的就是讓你在十分鐘內學會shell程式設計。shell程式設計的精髓在於條件測試和分支結構。shell的分支結構與c語言的分...

JPA核心內容

二 對應的狀態 三.物件之間的關係 四.單向多對一的配置 五 二級快取 id generatedvalue strategy generationtype.identity sequence auto table private long id 臨時,持久,刪除,游離 乙個持久化狀態的物件,如果被修...

Vuex核心內容 二

用於處理非同步的資料 如果通過非同步操作變更資料,必須通過action,而不能使用mutation,但是在action中還是要通過觸發mutation的方式間接變更資料。例項 const store newvuex.store mutations actions 1000 觸發actions的一種方...