Linux命令(文件和文本篇)_第1頁(yè)
Linux命令(文件和文本篇)_第2頁(yè)
Linux命令(文件和文本篇)_第3頁(yè)
Linux命令(文件和文本篇)_第4頁(yè)
Linux命令(文件和文本篇)_第5頁(yè)
已閱讀5頁(yè),還剩255頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

[Linux命令]

[文件和文本篇]

目錄

Shell基礎(chǔ)及工具篇

1今天的主角是Shell

2用chsh來(lái)改變Shell

3export將環(huán)境變量昭告天下

4read,傾聽(tīng)是一種美德

5oxpr,一款多功能計(jì)算器

6tmux給你帶來(lái)多窗口的享受

7用alias起個(gè)昵稱吧

8history是歷史的鏡子

9xargs絕對(duì)的護(hù)花使者

10time,你最懂時(shí)間

11sleep,睡眠也有學(xué)問(wèn)

文件和磁盤(pán)篇

1file命令探尋文件信息

2In連接你我他

3find命令上篇一一find初體驗(yàn)

4find命令下篇find引出的正則知識(shí)

5du最了解磁盤(pán)占用

6壓縮系列之gzip

7壓縮系列之二bzip2

8壓縮系列之三zip

9dd造出最大的黑洞

文本處理篇

1echo命令上篇一一幫你發(fā)聲,替你歌唱

2echo命令下篇一一讓世界充滿色彩

3搜索三兄弟grep、egrep和fgrep

4sed的流藝術(shù)之一初體驗(yàn)

5sed的流藝術(shù)之二花樣命令

6sed的流藝術(shù)之三一露幾手

7sed的流藝術(shù)之四一一插入和控制

8awk是三兄弟系列之入門(mén)

9awk是三兄弟系列之二一一多行操作

10awk是三兄弟系列之三--多文件操作

11awk是三兄弟系列之四外部調(diào)用

12awk是三兄弟系列之五一一實(shí)戰(zhàn)

13cut是修剪小能手

14wc幫你計(jì)算字?jǐn)?shù)

15split是拆分小能手

16paste用來(lái)拼接

17sort命令上篇sort幫你排序

18sort命令下篇關(guān)于k選項(xiàng)的大討論

19Vi中的替換藝術(shù)

20加密工具全家桶

Shen基礎(chǔ)及工具篇

在Shell及工具篇中,我們將為大家?guī)?lái)11篇文章,所有內(nèi)容都是圍繞著Shell展開(kāi)

的,包括了:

?今天的主角是Shell

?用chsh來(lái)改變Shell

?export將環(huán)境變量昭告天下

?read,傾聽(tīng)是一種美德

?expr,一款多功能計(jì)算器

?tmux給你帶來(lái)多窗口的享受

?用alias起個(gè)昵稱吧

?history是歷史的鏡子

?xargs絕對(duì)的護(hù)花使者

?time,你最懂時(shí)間

?sleep,睡眠也有學(xué)問(wèn)

在這里,你不僅可以了解到Shell發(fā)展歷史中的趣聞、感受到tmux的便捷,還能掌

握配置history的各種方法

讓我們現(xiàn)在就開(kāi)始Shell學(xué)習(xí)之旅吧!

1今天的主角是Shell

老婆問(wèn)我什么是Shell

面對(duì)做會(huì)計(jì)行業(yè)的老婆,我沒(méi)有信心回答好這個(gè)問(wèn)題。

但是對(duì)于閱讀本書(shū)的讀者們來(lái)說(shuō),相信大家都有計(jì)算機(jī)知識(shí)背景,所以,我還是很

有信心能夠解釋清楚的。

首先,我們今天所說(shuō)的Shell,既不是海灘上美麗的貝殼兒,也不是荷蘭那家鼎鼎大

名的殼牌公司,而是用在UNIX/Linux操作系統(tǒng)中的一個(gè)叫作Shell的工具。

其次,眾所周知,UNIX/Linux操作系統(tǒng)的心臟是”內(nèi)核〃,內(nèi)核主要負(fù)責(zé)控制硬

件、管理內(nèi)存和調(diào)度任務(wù),而Shell則是用戶與操作系統(tǒng)之間的一座橋梁,用戶可以

利用Shell實(shí)現(xiàn)對(duì)UNIX/Linux操作系統(tǒng)及其內(nèi)核的控制和操作。

最后,Shell已經(jīng)發(fā)展成為一種解釋型編程語(yǔ)言,它不僅包含了大量的命令以實(shí)現(xiàn)與

操作系統(tǒng)的對(duì)話,還可以實(shí)現(xiàn)變量定義、條件判斷、循環(huán)控制、函數(shù)調(diào)用等功能,

我們完全可以利用Shell實(shí)現(xiàn)很多復(fù)雜的業(yè)務(wù)邏輯,

如果只用一張示意圖來(lái)說(shuō)明什么是Shell的話,那么下面的這張圖再合適不過(guò)了。

圖1什么是Shell

一睹Shell的芳容

當(dāng)我們打開(kāi)一臺(tái)安裝有UNIX/Linu乂操作系統(tǒng)的電腦,輸入用戶名、密碼登錄成功

后,系統(tǒng)便會(huì)啟動(dòng)一個(gè)Shell,它是一個(gè)交互式的界面,會(huì)等待我們輸入指令,就像

這樣:

[roc@roclinux

當(dāng)我們輸入了一條命令之后,Shen會(huì)經(jīng)過(guò)一系列的處理環(huán)節(jié),然后執(zhí)行,并為我們

返回執(zhí)行結(jié)果,就像下面這樣;

[roc@roclinux~]$uname-aLinuxroclinux2.6.32-220.4.1.el6.x8664

#1SMPTueJan2402:13:44GMT2012x86=64x86_64x86_64GNU/Linux

大家可以看到,我們輸入的命令是"uname-a",這是一個(gè)顯示操作系統(tǒng)基本信息

的Shell命令,像這樣的命令,在Shell中有上千個(gè),比如Is.alias,cat、

chgrpxawk、ulimit、rm,等等。

下面來(lái)一起看一下Is命令的運(yùn)行效果,如圖2所示。

???2roc@roclinux;~/progfam(ssh)

[roc0rcclinuxprogram]$Is

auth.rbgomysqlphp-vim

bzip2-l.046gol.1.2mysql-5.6.14php-vim74

■?

composer?pharhadoop-1.2.1mysql-5.6.20php-5.5.5.pdo.gdyii

curl-7.34.0iproute2-4.4.0nginxredisyii-l.1.13

gangliajqnginx-1.4.3redis-2.6.16

ganglia-3.6.1json-cnginx-1.4.4splan

gitlibeventPhpthrift

git-libevent-2.0.21php-5.5.22thrift-0.9.1

[roc@roclinuxprogram]$.

圖2Is命令的運(yùn)行效果

對(duì)于Shell高手來(lái)說(shuō),交互式Shell不能完全滿足他們的日常需要,他們更善于把工

作和任務(wù)通過(guò)自動(dòng)化方式來(lái)完成,所以,Shell腳本應(yīng)運(yùn)而生。

當(dāng)把多個(gè)Shell命令按照一定的邏輯寫(xiě)到一個(gè)文件中時(shí),這個(gè)文件就可以被叫

作"Shell腳本文件"。而執(zhí)行這樣的腳本,就可以實(shí)現(xiàn)一部分工作的自動(dòng)化了。

世界上第一款Shell

開(kāi)門(mén)見(jiàn)山,世界上第一款Shell,叫作ThompsonShell,于1971年誕生,1975年

開(kāi)始廣泛傳播。那時(shí)很多閱讀這本書(shū)的同學(xué)或許還沒(méi)有出生吧。

至于為什么叫作ThompsonShell,故事要從1965年說(shuō)起。

那一年,貝爾實(shí)驗(yàn)室參與到了一個(gè)意義重大的項(xiàng)目中,那就是和美國(guó)通用電氣、麻

省理工學(xué)院共同開(kāi)發(fā)一個(gè)多用戶、多進(jìn)程的操作系統(tǒng),產(chǎn)品代號(hào)為"Multics"。

一年后,故事的主人公,年僅23歲的有志青年Thompson加入貝爾實(shí)驗(yàn)室,參與到了

Multics項(xiàng)目的開(kāi)發(fā)中來(lái)。

不幸的是,由于進(jìn)度緩慢,Multics項(xiàng)目在1969年擱淺了。而Thompson卻在這個(gè)項(xiàng)

目中積累了大量的操作系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn),并在次年開(kāi)始了一款全新操作系統(tǒng)的開(kāi)發(fā)工

作,這就是后來(lái)赫赫有名的UNIX。1970年,也因此被稱為UNIX元年!

很快,就在1971年;UNIX在實(shí)驗(yàn)室范圍內(nèi)發(fā)布了它的VI版本,而ThompsonShell

也隨之誕生。1975年,UNIX的第六個(gè)版本面向公眾發(fā)布,ThompsonShell也隨之

得到了廣泛地傳播。

所以ThompsonShell也被叫作V6Shell。

那些年,我們一起追的Shell

2011年,九把刀導(dǎo)演的《那些年,我們一起追的女孩》上映,人們都在回憶自己曾

經(jīng)追過(guò)的女孩。而作為L(zhǎng)inux愛(ài)好者,有沒(méi)有你曾經(jīng)追過(guò)的Shell呢?

在Linux的歷史長(zhǎng)河中,曾經(jīng)出現(xiàn)過(guò)很多種類的Shell,它們之間有的是傳承關(guān)系,

有的是競(jìng)爭(zhēng)關(guān)系,有的已經(jīng)不為人所知,有的則家喻戶曉。

大浪淘沙過(guò)后,最終流傳下來(lái)的Shell,才是值得我們了解和學(xué)習(xí)的Shell,如表1

所示。

表1值得了解和學(xué)習(xí)的Shell

名稱全稱誕生于流行于

shBourneShell1977UNIX

(t)cshCShell1978UNIX

kshKornShell1983UNIX

bashBourneAgainShell1989Linux

zshZhongShaoShell(非官方說(shuō)法)1990Linux

dashDebianAlmquistShell2002Linux

其實(shí)還有一些偏小眾的Shell,大家有興趣也可以去了解和關(guān)注一下,如pdksh.

scsh、psh、mksh,等等。

zsh是中國(guó)人開(kāi)發(fā)的么

我猜一定會(huì)有人問(wèn),zsh的全稱是ZhongShaoShell,難道zsh是中國(guó)人開(kāi)發(fā)的

么?

非也,非也。zsh的作者是美國(guó)普林斯敦大學(xué)的一位學(xué)生,他的名字叫作Paul

Falstado當(dāng)時(shí)有一位名叫ZhongSha。的助教,他登錄LinuxShell時(shí)使用的ID是

zsh,Paul非常喜歡這個(gè)名字,恰好z的美式英語(yǔ)的發(fā)音和csh的c又非常像,于是就

選擇了zsh作為自己編寫(xiě)的Shell的名字了。

是不是很有趣呢,我們?cè)賮?lái)講一個(gè)有關(guān)csh的故事。

回到遙遠(yuǎn)的1978年,那時(shí)的Billjoy(BSD操作系統(tǒng)作者、TCP/IP設(shè)計(jì)者、vi作

者、NFS作者、SUN公司創(chuàng)立者之一)年僅24歲,正在加州大學(xué)伯克利分校攻讀碩士

學(xué)位。那一年,他為BSD開(kāi)發(fā)了一款Shell,起名叫作CShell,簡(jiǎn)稱csho之所以

叫CShell,是因?yàn)樗恼Z(yǔ)法和C語(yǔ)言非常相似。

而在1978年到1983年間,又有多位計(jì)算機(jī)專家在csh的基礎(chǔ)上增加了豐富的功能,

包括拼寫(xiě)校驗(yàn)、歷史記錄、作業(yè)控制、命令行編輯器等。在為這個(gè)增強(qiáng)版csh取名

時(shí),專家們借鑒了歷史上一種具有〃命令補(bǔ)全"功能的操作系統(tǒng)TEYEX的靈感,最終

將它取名為tcsh,即TENEXcsho

讓Shell飛入尋常百姓家

唐代詩(shī)人劉禹錫,在《烏衣巷》中的一句"舊時(shí)王謝堂前燕,飛入尋常百姓家",

流傳至今。

而我們希望曾經(jīng)聞名遐邇的各種Shell,也能"飛入"我們的電腦,讓我們能更近距

離地感受它們的設(shè)計(jì)思想和功能e

以CentOS發(fā)行版為例,如果想查看當(dāng)前系統(tǒng)都安裝了哪些Shell,可以這樣:

[root@roclinuxcat/etc/shells/bin/sh/bin/bash/sbin/nologin

可以看到,/etc/shells文件中記錄了"當(dāng)前系統(tǒng)中安裝了哪些種類的Shen〃:

?/bin/sh:這是BourneShell0

?/bin/bash:這是BourneAgainShell。

/bin/nologin:這并不是一個(gè)Shell,而是指"無(wú)法登錄

那么系統(tǒng)當(dāng)前使用的到底是什么Shell呢,我們可以這樣來(lái)查看:

[root@rodinuxecho$SHELL/bin/bash

可見(jiàn),我們當(dāng)前所使用的是BourneAgainShell。

如果想嘗試一下zsh,應(yīng)該怎么安裝呢?非常簡(jiǎn)單:

[root@roclinuxyuminstallzsh

就這樣一條語(yǔ)句,就可以讓zsh〃飛”入你家6

安裝完成后,是不是已經(jīng)迫不及待地想體驗(yàn)一下zsh7!這也不難:

#首先定位到zsh的絕對(duì)路徑[root@roclinuxwhichzsh/bin/zsh#使用?

s選項(xiàng)更改登錄Shell的類型[root@roclinux~]$chsh-s/bin/zsh

Changingshellforroot.Shellchanged*

只需上面兩步,我們就已經(jīng)把root賬戶的登錄Shell更改為zsh7,接下來(lái),只要退

出當(dāng)前shell,再以root賬戶重新登錄進(jìn)來(lái),就可以享受zsh啦!

如果想讓其他的Shell也“飛“進(jìn)你家,如法炮制就好。

可以評(píng)價(jià)下這些Shell么

我們不會(huì)把每種Shell的優(yōu)缺點(diǎn)都列在這里,因?yàn)樵?jīng)追的很多Shell,現(xiàn)如今已不

是主流,有被新Shell替代的,也有因功能欠缺被淘汰的。所以,為了節(jié)省時(shí)間,這

里只簡(jiǎn)單聊聊bash和zsh這兩種Shell,原因是,前者主流,后者強(qiáng)大。

bash當(dāng)屬使用最廣泛的Shell了,它融合了csh和ksh的長(zhǎng)處,規(guī)避了兩者的短處,

是目前Shell中的首選。許多Linux系統(tǒng)、MACOS系統(tǒng)都將bash作為了系統(tǒng)的默認(rèn)

Shell,所以大家也會(huì)看到,非常多的書(shū)籍、示例、項(xiàng)目都是面向bash的,本書(shū)也

不例外,畢竟,我們應(yīng)該將有限的時(shí)間用在收益最大的事情上,對(duì)不對(duì)。

zsh,被有些人稱為〃終極Shell"。這并不算夸張,zsh真的算是Shell中的集大成

者,它融合了tcshxksh和bash的優(yōu)秀之處,而且還完全兼容bash,對(duì)于用慣了

bash的同學(xué)來(lái)說(shuō),幾乎可以無(wú)縫遷移。而zsh在歷史記錄提示、命令補(bǔ)全、別名、

語(yǔ)法高亮等方面都有著超出預(yù)期的用戶體驗(yàn)。

好了,本書(shū)的第一篇文章就到這里了。本文中用到的chsh命令,我們會(huì)在下一篇中

進(jìn)行重點(diǎn)講解,來(lái),一起進(jìn)入下一篇!

2用chsh來(lái)改變Shell

我想知道我機(jī)器安裝了哪些Shell

chsh命令本身并不復(fù)雜,它的功能比較單一,就是負(fù)責(zé)展示和修改我們系統(tǒng)的登錄

Shelly

想修改登錄Shell,首先要知道我們的系統(tǒng)安裝了哪些Shell.這里有兩種方法可以

查看.

方法一:

[roc@roclinuxchsh-1/bin/sh/bin/bash/sbin/nologin/bin/zsh

方法

[roc@roclinux~]$cat/etc/shells/bin/sh/bin/bash/sbin/nologin

/bin/zsh

其實(shí)chsh-1命令本質(zhì)上也是去查看/etc/shells文件。

查看當(dāng)前正在使用的Shell

只使用一個(gè)環(huán)境變量,就可以查看到當(dāng)前正在使用的Shell啦:

[roc@roclinux~]$echo$SHELL/bin/bash

注意:SHELL一定要大寫(xiě)。可以看到,我們目前使用的Shell是bash。

聽(tīng)說(shuō)zsh不錯(cuò),于是我們就通過(guò)在命令行執(zhí)行zsh命令切換到了zsh環(huán)境??墒?,為

什么查看當(dāng)前Shell類型仍然是/bin/bash呢?

[roc@roclinux~]$zsh[roc@roclinux]~%echo$SHELL/bin/bash

[roc@roclinux]~%

請(qǐng)注意,我們雖然執(zhí)行了zsh,但是所謂〃當(dāng)前的Shell"是一個(gè)大環(huán)境的概念,是

針對(duì)一個(gè)已登錄的用戶而言的。而我們執(zhí)行zsh只是啟動(dòng)了一個(gè)zsh的解釋器程序而

已,并沒(méi)有改變大環(huán)境。如果想改變"當(dāng)前的Shell",那么還是要求助于chsh才

可以。

將Shell環(huán)境真正切換到zsh

[roc@roclinux~]$chsh-s/bin/zshChangingshellforroc.

Password:Shellchanged.

使用Chsh命令的-s選項(xiàng)就可以修改登錄的Shell了。

如果我們這時(shí)候滿懷欣喜地執(zhí)行echo$SHELL,就會(huì)發(fā)現(xiàn)然輸出的仍是/bin/bash。

這是因?yàn)閏hsh改變的是我們登錄Shell的配置,我們必須退出再重新登錄Shell,才

可以完全投入到zsh的懷抱。

真是一波三折,退出并重新登錄后,終于看到了我們想要的/bin/zsh了:

[roc@roclinux]~%echo$SHELL/bin/zsh

chsh-s到底修改了哪里

到了揭開(kāi)迷底的時(shí)刻啦!

chsh-s其實(shí)修改的就是/etc/passwd文件中和我們所登錄的用戶名相對(duì)應(yīng)的那一

行?,F(xiàn)在我們來(lái)查看一下:

[roc@roclinux]~%cat/etc/passwd|grepAroc

roc:x:1001:1001;;/home/roc:/bin/zsh

可以發(fā)現(xiàn),輸出內(nèi)容的最后部分已經(jīng)變成了/bin/zsh了。重啟系統(tǒng)的時(shí)候,Linux

就會(huì)讀取這一命令來(lái)啟動(dòng)新的Shell。

好了,我們要恢復(fù)正常的工作環(huán)境,把Shen修改回我們熟悉的/bin/bash了:

[roc@roclinux]~%chsh-s/bin/bashChangingShellforroc.

Password:Shellchanged.

3export將環(huán)境變量昭告天下

export可以展示Shell環(huán)境變量

我們直接進(jìn)入正題,先來(lái)看看執(zhí)行export會(huì)輸出什么內(nèi)容:

[roc@roclinux~]$exportdeclare-xCVS_RSH="ssh"declare-x

GEM_H0ME="/usr/local/rvm/gems/ruby-2.2.3"declare-x

GEM_PATH="/usr/local/rvm/gems/ruby-2.2.3:/usr/local/rvm/gems/ruby-

2.2.3@global"declare-xG0R00T="/home/roc/program/go"declare-x

G_BROKEN_FILENAMES="1"declare-xHISTCONTROL="ignoredups"declare

-xHISTSIZE="1000"declare-xHOME=*7home/roc"declare-x

HOSTNAME="roclinux"declare-xIRBRC="/usr/local/rvm/rubies/ruby-

2.2.3/.irbrc"declare-xJAVA_HOME='7usr/lib/jvm/jre-1.7.0-

openjdk.x86_64"declare-xLANG="zh_CN.gb2312"declare-x

LC_ALL="zh_CN,gb2312"declare-xLESSOPEN="|/usr/bin/lesspipe.sh

%s"declare-xLOGNAME="roc"declare-x

LS_COLORS="rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;ll:so

38;5;13:do=38;5;5:bd=48;5;232;38;5;ll:cd=48;5;232;38;5;3:or=48;5;232

38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;ll;38;5;16

ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;2

;38;5;15:ex=38;5;34:*,tar=38;5;9:4e.tgz=38;5;9:*.arj=38;5;9:*.taz=38;

;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.zip=38;5;9

*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lz=38;5;9:*.xz=38;5;

:*.bz2=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.bz=38;5;9:*.tz=38;5;9:*.d

b=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.rar=38;5;9:*.ace=38;5;9:*.zoo=3

;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.jpg=38;5;13:*.jpeg=38;5

13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;

;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=3

;5;13:*.png=38;5;13:*.5Vg=38;5;13:*.5Vgz=38;5;13:*.mng=38;5;13:*.pcx

38:5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.in2v=38;5;13:*.m

v=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4V=38;5;13:*.mp4v=38;5;13:*

vob=38;5;13:**qt=38;5jl3:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*

rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:

.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5j13:*

yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13;

.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45

*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;

5:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;

5:*.spx=38;5;45:*.xspf=38;5;45:"declare-x

MAIL="/var/spool/mai1/roc"declare-x

MY_RUBY_HOME="/usr/local/rvm/rubies/ruby-2.2.3"declare-x

OLDPWD=,7home/roc/test/20160403"declare-xPATH="/usr/1ib/jvm/jre-

1.7.0-openjdk.x86_64/bin:/home/roc/program/yii

/framework/:/home/roc/program/php/bin:/home/roc/bin:/home/roc/progra

/thrift/bin:/home/roc/program/go/bin:/home/roc/program/vim/bin:/home

roc/program/git/bin:/home/roc/bin:/usr/lib/jvm/jre-1.7.0-

openjdk.x86_

64/bin:/home/roc/program/yii/framework/:/home/roc/program/php/bin:/h

me/roc/bin:/home/roc/program/thri-Ft/bin:/home/roc/program/go/bin:/ho

e/roc/program/vim/bin:/home/roc/program/git/bin:/usr/local/rvm/gems/

uby-2.2?3/bim/usr/local/rvm/gems/ruby-

2.2.3@global/bin:/usr/local/rvm/rubies/ruby-

2.2.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:

/usr/sbin:/sbin:/www/wdlinux/mysql/bin:/usr/local/rvm/bin:/home/roc/

in:/www/iA/dlinux/mysql/bin:/home/roc/bin"declare-xPWD="/home/roc"

declare-xRUBY_VERSION="ruby-2.2.3"declare-xSHELL="/bin/bash”

declare-xSHLVL="2"declare-xSSH_CLIENT="3452932

22000"declare-xSSH_CONNECTION="9211887

0622000"declare-xSSH_TTY=,7dev/pts/lndeclare-x

TERM="screen-256color"declare-xTMUX=

1001/default,35631,0"declare-xTMUX_PANE="%25"declare-x

USER=Hroc,*declare-x_system_arch=**x86_64'1declare-x

_system_name="CentOS"declare-x_system_type="Linux"declare-x

_system_version="6"declare-xrvm_alias_expandeddeclare-x

rvm_bin_flagdeclare-xrvm_bin_path="/usr/local/rvm/bin"declare-

xrvm_delete_flagdeclare-xrvm_docs_typedeclare-xrvm_file_name

declare-xrvm_gemstone_package_filedeclare-xrvm_gemstone_url

declare-xrvm_hookdeclare-xrvm_nicenessdeclare-x

rvm_nightly_flagdeclare-xrvm__only_path_flagdeclare-x

rvm_path="/usr/local/rvmndeclare-xrvm_prefix=,,/usr/locar,

declare-xrvm_proxydeclare-xrvm_quiet_flagdeclare-x

rvm_ruby_aliasdeclare-xrvm_ruby_bitsdeclare-x

rvm_ruby_configuredeclare-xrvm_ruby_filedeclare-x

rvm_ruby_global_gems_pathdeclare-xrvm_ruby_makedeclare-x

rvm_ruby_make_installdeclare-xrvm_ruby_modedeclare-x

rvm_ruby_stringdeclare-xrvm_ruby_urldeclare-xrvm_script_name

declare-xrvm_sdkdeclare-xrvm_silent_flagdeclare-x

rvm_sticky_flagdeclare-xrvm_system_flagdeclare-xrvm_use_flag

declare-xrvm_user_flagdeclare-xrvm_version="l.26.11(master)"

declare-xrvm_wrapper_name

export輸出的內(nèi)容就是bash的所有環(huán)境變量了,滿滿的兩頁(yè)看來(lái)還真是不少呀。

env/set/export/declare的區(qū)別

在Linux系統(tǒng)中,除了export之外,envxset和declare這三個(gè)命令也可以顯示

Shell中的變量。那這四個(gè)命令有什么區(qū)別呢?

這個(gè)問(wèn)題,我們需要從Shell變量說(shuō)起。Shell的變量,可以分為“環(huán)境變

量〃和"自定義變量"兩種類型,兩者的區(qū)別在于作用范圍不同。環(huán)境變量可以在

其進(jìn)程的子進(jìn)程中繼續(xù)有效,而自定義變量的勢(shì)力范圍則無(wú)法延伸到其進(jìn)程的子進(jìn)

程中。

好了,知道了環(huán)境變量和自定義變量的區(qū)別,我們正式開(kāi)始介紹

export/env/set/declare的區(qū)別:

?env:顯示當(dāng)前用戶的環(huán)境變量,但不會(huì)顯示其自定義變量。

?export:功能同env一樣,也是顯示當(dāng)前用戶的環(huán)境變量,只不過(guò)該命令的輸出

是按變量名進(jìn)行排序的。

?declare;顯示當(dāng)前Shell中定義的所有變量,包括用戶的環(huán)境變量和自定義變

量,該命令的輸出按變量名進(jìn)行排序。

?set:功能同declare一樣,顯示當(dāng)前Shell中定義的所有變量,包括用戶的環(huán)境

變量和自定義變量。

根據(jù)上面的說(shuō)明,我們可以得出下面的結(jié)論:

?env和export顯示的是環(huán)境變量。

?set和declare顯示的是環(huán)境變量和自定義變量。

我們以set和declare為例,來(lái)看一下是否真的是這樣:

[roc^roclinux~]$set>set.txt[roc@roclinuxdeclare>

declare.txt[roc@roclinuxdiffset.txtdeclare.txt54c54<

_=clear—>_=set

看到了吧,set和declare的輸出幾乎是一樣的。

唯一的區(qū)別就在于這個(gè)〃下劃線變量"。下劃線變量(_)表示用戶上一次輸入的命

令的最后一個(gè)參數(shù)。上面兩條命令之所以出現(xiàn)不同,是因?yàn)樵趫?zhí)行set前執(zhí)行了

clear命令,而在執(zhí)行declare之前,執(zhí)行了set命令。

設(shè)置ShQll環(huán)境變量

$PATH環(huán)境變量是Linux系統(tǒng)中最常用的變量之一,我們先來(lái)看一下這個(gè)變量的內(nèi)

容:

[root@roclinux-]#echo$PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/b

相信細(xì)心的同學(xué)已經(jīng)觀察到了,$PATH變量的值是由多個(gè)路徑所組成的,并且用冒號(hào)

進(jìn)行了分隔。那么,問(wèn)題來(lái)了,這些路徑的作用是什么呢?

當(dāng)用戶在Linux系統(tǒng)中直接輸入一個(gè)命令(如date命令),而沒(méi)有指定其絕對(duì)路徑

時(shí),Linux就會(huì)求助于$PATH啦,Linux會(huì)依次進(jìn)入到$PATH變量所指定的各個(gè)路徑

中,去尋找是否存在此命令(date命令),如果找到了,就執(zhí)行該命令;如果沒(méi)有

找到,就直接退出,并提示用戶未找到該命令。

在運(yùn)維工作中,用好$PATH變量是可以大大提升工作效率的。假

如/home/roc/operation_tools文件夾下存放著我們自制的各種運(yùn)維小工具,每次

使用這些小工具時(shí)又不想總指定其絕對(duì)路徑,那么,我們應(yīng)該怎么辦呢?沒(méi)錯(cuò),我

們應(yīng)該把這個(gè)路徑追加到$PATH變量中去,具體的做法是這樣:

exportPATH=$PATH:/home/roc/operation_tools

上述命令執(zhí)行成功后,我們的運(yùn)維小工具就可以直接被Linux系統(tǒng)找到了。從此以

后z當(dāng)我們想使用這些運(yùn)維小工具時(shí),就再也不用指定絕對(duì)路徑啦。

讓你真正體會(huì)export的威力

不知道你是否注意到上面例子中的一個(gè)細(xì)節(jié),那就是我們?cè)谠O(shè)置$PATH環(huán)境變量時(shí),

使用了export命令。如果沒(méi)有使用export,會(huì)有什么問(wèn)題嗎?

這個(gè)問(wèn)題問(wèn)得很好,這正好引出export的作用,那就是,使用export設(shè)置的變量就

成為了環(huán)境變量,而沒(méi)有使用export設(shè)置的則是自定義變

下面我們通過(guò)一個(gè)示例來(lái)看一下:

#我們?cè)诋?dāng)前Shell進(jìn)程中指定了varl變量[roc@roclinuxvarl="hello"

[roc@roclinux~]$echo$varlhello#我們?cè)诋?dāng)前Shell進(jìn)程中又指定了var2

變量[roc@roclinux~]$var2="worldH[roc@roclinux~]$echo$var2

world#我們通過(guò)export發(fā)布varl[roc@roclinux~]$exportvarl#我們進(jìn)

入到一個(gè)bash子進(jìn)程中[roc@roclinux~]$bash變量仍然有效,而var2

變量已經(jīng)無(wú)效了[roc@roclinux~]$echo$varl#輸出變量的值hello

[roc@roclinux~]$echo$var2#什么也沒(méi)有輸出

通過(guò)上面的示例,我們可以清楚地看到;環(huán)境變量可以在其進(jìn)程的子進(jìn)程中繼續(xù)有

效,而自定義變量則無(wú)效。

誤操作惹的禍

"哎呀,不好了,我的Linux系統(tǒng)出問(wèn)題了,我竟然連st命令都沒(méi)辦法運(yùn)行了,執(zhí)

行時(shí)總是提示我找不到命令,這是怎么回事?我只是按照上面的示例執(zhí)行了一下命

令,就成這個(gè)樣子了,我該怎么辦?。?

”同學(xué),讓我看看你到底執(zhí)行的是什么命令?"

"我執(zhí)行的命令,很簡(jiǎn)單,就是這個(gè):"

$exportPATH=/home/to/operation_tools

〃額,問(wèn)題找到了,你的命令輸錯(cuò)啦,來(lái)看正確的用法吧。

$exportPATH=$PATH:/home/to/operation_tools

再對(duì)比一下你的命令,你的命令中缺少了$PATH,這樣會(huì)清空原來(lái)$PATH的內(nèi)容,

$PATH中沒(méi)有了系統(tǒng)指定的路徑Linux就無(wú)法找到要執(zhí)行的命令。這是一個(gè)多么可怕

的誤操作啊!

大家一定要記住這個(gè)教訓(xùn)呀,在設(shè)置PATH環(huán)境變量時(shí)要格外小心哦。

4read,傾聽(tīng)是一種美德

人生第一次編程

不知道你是否還記得你的第一次計(jì)算機(jī)編程。

我對(duì)"第一次"記憶猶新,那是一個(gè)很神奇的時(shí)刻。當(dāng)我把有生以來(lái)編寫(xiě)的第一個(gè)C

程序交給計(jì)算機(jī)執(zhí)行時(shí),黑色的屏幕上顯示出了一行字"pleaseinputyour

name:°

我懷著無(wú)比激動(dòng)的心情寫(xiě)下我的名字,然后按下回車。美妙的時(shí)刻就此凝固

了,計(jì)算機(jī)毫無(wú)差錯(cuò)地顯示出:

welcome!!!roc.

如果現(xiàn)在讓你用Shell來(lái)實(shí)現(xiàn)同樣效果的程序,不知道你是不是能很快就寫(xiě)出來(lái)呢?

本文就來(lái)幫你實(shí)現(xiàn)這個(gè)程序,在實(shí)現(xiàn)該程序之前,我們還是先來(lái)學(xué)習(xí)一下Linux系統(tǒng)

中最擅長(zhǎng)傾聽(tīng)的命令——read吧。

傾聽(tīng)鍵盤(pán)的聲音

read命令用來(lái)傾聽(tīng)標(biāo)準(zhǔn)輸入或文件輸入,并把信息存放到變量中。

從read命令的定義可以看出,傾聽(tīng)鍵盤(pán)是read的主要職責(zé)之一。

現(xiàn)在,我們用Shell來(lái)模擬一下上面的(:程序吧:

#!/bin/bashecho-n"pleaseinputyourname:"readnameecho

"welcome!!!$name"exit0

就這么簡(jiǎn)單,使用read命令來(lái)傾聽(tīng)用戶的輸入,并把用戶的輸入內(nèi)容自動(dòng)保存到指

定的name變量中,最后使用echo實(shí)現(xiàn)輸入內(nèi)容的顯示。

上面的Shell腳本是不是已經(jīng)是最精簡(jiǎn)的了?當(dāng)然不是,還可以繼續(xù)精簡(jiǎn),我們可以

直接使用read自帶的顯示提示語(yǔ)功能,省略程序中的echo語(yǔ)句:

#!/bin/bashread-p"pleaseinputyourname:"nameecho"welcome

!!!$name"exit0

上面腳本中的read的叩選項(xiàng)就是用來(lái)顯示提示語(yǔ)的。

在這個(gè)例子中,我們只是讓read來(lái)接收name變量的值,那么read可以同時(shí)接收兩個(gè)

甚至更多的變量嗎?答案是可以的。

#!/bin/bashread-p"pleaseinputyournameandplace:'*nameplace

echo"welcome$nameto$place"exit0

看到了嗎?read后面可以指定兩個(gè)變量name和place,當(dāng)用戶輸入完成時(shí),read會(huì)

以空格來(lái)分割用戶的輸入內(nèi)容,并把輸入的內(nèi)容分別存放到后面的變量中。

按照這個(gè)規(guī)律,read完全可以指定3個(gè)、4個(gè)……N個(gè)變量。需要注意的是,當(dāng)用戶的

實(shí)際輸入和程序期望輸入的變量個(gè)數(shù)不等時(shí),又會(huì)出現(xiàn)什么情況呢?

這是一個(gè)好問(wèn)題,比如上面的腳本期望用戶輸入name和place兩個(gè)變量的值,而我

們卻故意輸入一個(gè)數(shù)據(jù)或三個(gè)數(shù)據(jù),這時(shí)來(lái)看看腳本的執(zhí)行情況:

示例一:只輸入一個(gè)數(shù)據(jù)

[roc@roclinux./test.shpleaseinputyournameandplace:roc

welcomerocto

示例二:輸入多個(gè)數(shù)據(jù)

[roc@roclinux~]$./test.shpleaseinputyournameandplace:roc

beijingshanghaitianjinwelcomeroctobeijingshanghaitianjin

通過(guò)上面腳本的執(zhí)行,我們可以得出以下的結(jié)論:

1.如果輸入的數(shù)據(jù)數(shù)量少于變量的個(gè)數(shù),那么多余的變量不會(huì)獲取到數(shù)據(jù),即變量

值為空。

2,如果輸入的數(shù)據(jù)數(shù)量多于變量的個(gè)數(shù),那么超出的數(shù)據(jù)將都賦值給最后一個(gè)變

J=L

里。

還有一個(gè)非常特殊的情況,就是在編寫(xiě)腳本時(shí),如果read命令后面沒(méi)有寫(xiě)任何變

量,腳本執(zhí)行時(shí),我們輸入數(shù)據(jù),那輸入的數(shù)據(jù)會(huì)存放到哪里呢?

對(duì)于這種極端情況,Shell的設(shè)計(jì)者早就預(yù)料到了:用戶的數(shù)據(jù)會(huì)存放到一個(gè)叫作

$REPLY的環(huán)境變量中去。

#!/bin/bash##read-p"pleaseinputyournameandplace:"echo

"welcome$REPLY"exit0[roc@roclinux~]$bashtest.shpleaseinput

yournameandplace:rocbeijingwelcomerocbeijing

傾聽(tīng)也可以有時(shí)間限制

read,非常樂(lè)于傾聽(tīng)用戶的聲音,但有的時(shí)候,用戶長(zhǎng)時(shí)間不輸入,那read也可以

有自己的后手。

redd命令提供了選項(xiàng),可以用來(lái)設(shè)置一個(gè)傾聽(tīng)的時(shí)限。如果超過(guò)所設(shè)置的時(shí)限的

話,那么read的耐心也就到此為止嘍.

#!/bin/bashifread-t5-p"pleaseinputyournamewithin5s:"

namethenecho"welcome!!!$name"elseecho"sorry,tooslow"fi

exit0

上面的腳本就使用了選項(xiàng),用來(lái)指定等待輸入的時(shí)長(zhǎng)(秒)。

上述腳本表示read會(huì)等待用戶的輸入,但丑話說(shuō)在前,如果5秒內(nèi)用戶沒(méi)有響應(yīng),那

么read就會(huì)自動(dòng)結(jié)束,并顯示"sorry,tooslow"來(lái)抱怨一下用戶。可見(jiàn),read

命令也可以有自己的態(tài)度的。

密碼輸入場(chǎng)景

還有一種使用場(chǎng)景非常特殊,就是密碼輸入,我們都不希望密碼明文顯示在屏幕

上,萬(wàn)一被別人看到了,可就不妙了。對(duì)于這種場(chǎng)景,我們希望實(shí)現(xiàn)隱藏輸入的效

果,read命令使用.s選項(xiàng)即可實(shí)現(xiàn)這樣的效果;

#!/bin/bashread-s-p"pleaseinputyourcode:"passwordecho

"hehe,yourpasswordis$password"

上面的程序使用了-S選項(xiàng),它實(shí)現(xiàn)的效果是用戶在輸入的時(shí)候,屏幕上不顯示任何

信息。

這樣,是不是再也不用擔(dān)心密碼被別人看到了?

內(nèi)容來(lái)自文件

前面我們說(shuō)過(guò),read命令不僅能監(jiān)聽(tīng)鍵盤(pán)輸入,還能讀取文件內(nèi)容,上面的示例都

在說(shuō)鍵盤(pán),下面就來(lái)說(shuō)文件。

首先,我們準(zhǔn)備一個(gè)素材文件,其內(nèi)容如下:

[roc@roclinux~]$cat-ntest.txt119248219247319246

下面,我們?yōu)榇蠹艺故緍ead命令的三種讀取文件的方法。

第一種方法:使用-u選項(xiàng)

#!/bin/bash#assignthefiledescriptortofileforinputfd#3

isInputfileexec3<test.txt#readthefileusingfd#3count=0

whileread-u3vandoletcount=$count+lecho"Line$count:$var"

doneecho"finished"echo"Linenois$count"#Closefd#3exec

3<&-

上面的腳本通過(guò)°exec3<test,txtw生成了編號(hào)為3的文件描述符,接著通

過(guò)Mread-u3varw來(lái)讀取文件內(nèi)容。最后通過(guò)"exec3<&-"關(guān)閉了3號(hào)文件描

述符。

我們來(lái)看下腳本的執(zhí)行效果

#執(zhí)行效果[roc@roclinux./test.shLine1:19248Line2:19247

Line3:19246finishedLinenois3

第二種方法:使用管道

#!/bin/bashcount=lcattest.txt|whilereadlinedoecho"Line

$count:$line"letcount=$count+ldoneecho"finished"echo"Lineno

is$count"exit0

請(qǐng)注意上面的用法"cattest.txt|whilereadline",通過(guò)這樣的方式來(lái)遍歷

test.txt文件的內(nèi)容,并按行賦值給變量line。

#執(zhí)行效果[roc@roclinux-]$./test.shLine1:19248Line2:19247

Line3:19246finishedLinenois1

咦,有個(gè)問(wèn)題°腳本最后輸出的是Linenois1,怎么行數(shù)是1呢,明明是3才對(duì)

?。?/p>

上面這個(gè)問(wèn)題,是由于管道導(dǎo)致的。我們知道,管道的兩邊一般需要新建進(jìn)程,當(dāng)

執(zhí)行完while語(yǔ)句后,新進(jìn)程也就結(jié)束了6而腳本中count是新進(jìn)程中的自定義變

量,進(jìn)程結(jié)束后該變量也就消失了(自定義變量的生命周期結(jié)束)o當(dāng)腳本執(zhí)行

echo時(shí),顯示的count變量是腳本中第一行定義的變量的值,而不是while語(yǔ)句中的

那個(gè)count變量了,因而輸出的結(jié)果當(dāng)然就是1了。

第三種方法:使用重定向

由于第二種方法中的count變量計(jì)數(shù)有誤,所以我們繼續(xù)為大家介紹第三種方法,這

種方法可以有效規(guī)避因?yàn)樾陆ㄟM(jìn)程而導(dǎo)致的變量值無(wú)法保留的問(wèn)題。

#!/bin/bashcount=0whilereadlinedoletcount=$count+lecho

"Line$count:$line"done<test.txtecho"finished"echo"Lineno

is$count"exit0

運(yùn)行腳本,看看執(zhí)行結(jié)果是否符合預(yù)期;

[roc@roclinux~]$bashtest.shLine1:19248Line2:19247Line

3:19246finishedLinenois3

分析上面的第二種方法和第三種方法可以發(fā)現(xiàn),它們最核心的區(qū)別是"管道技

術(shù)"變成了"重定向技術(shù)",從而成功規(guī)避了進(jìn)程中新生成自定義變量的問(wèn)題e

神奇的換行符

我們接著上面重定向的例子來(lái)說(shuō),我們把test.txt文件的內(nèi)容稍微變動(dòng)一下。

[roc@roclinuxcat-ntest.txt119248\219247\319246

可以看到,我們?cè)谇皟尚械暮竺娣謩e加上了一個(gè)反斜線(\),這個(gè)符號(hào)表示續(xù)行

符,它實(shí)現(xiàn)的效果是〃肉眼看上去是換行了,但是Linux認(rèn)為并沒(méi)有換行"。

如果我們把這個(gè)文件作為上面例子的輸入,那么會(huì)輸出什么呢?我們來(lái)看一下實(shí)際

效果:

[roc@roclinux~]$,/test.shLine1:192481924719246finishedLine

nois1

是不是和你想的一樣?這就是續(xù)行符(\)的作用,read命令在讀取數(shù)據(jù)時(shí),當(dāng)讀取

到續(xù)行符(\)時(shí),它不認(rèn)為這是一行的結(jié)束,而是會(huì)繼續(xù)讀取下一行,直到遇到真

正的換行符(\n)為止。

這樣一解釋,大家就應(yīng)該知道為什么腳本執(zhí)行結(jié)果里只有Line1了吧。

其實(shí)在read讀取到的數(shù)據(jù)中,所有的轉(zhuǎn)義符表示的特殊含義都是起作用的,如果你

不想讓它們起作用的話,請(qǐng)使用選項(xiàng)吧。

#!/bin/bash#assignthefiledescriptortofileforinputfd#3

isI

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論