很多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的一種方...