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

下載本文檔

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

文檔簡介

[Linux命令]

[文件和文本篇]

目錄

Shell基礎(chǔ)及工具篇

1今天的主角是Shell

2用chsh來改變Shell

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

4read,傾聽是一種美德

5oxpr,一款多功能計算器

6tmux給你帶來多窗口的享受

7用alias起個昵稱吧

8history是歷史的鏡子

9xargs絕對的護花使者

10time,你最懂時間

11sleep,睡眠也有學問

文件和磁盤篇

1file命令探尋文件信息

2In連接你我他

3find命令上篇一一find初體驗

4find命令下篇find引出的正則知識

5du最了解磁盤占用

6壓縮系列之gzip

7壓縮系列之二bzip2

8壓縮系列之三zip

9dd造出最大的黑洞

文本處理篇

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

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

3搜索三兄弟grep、egrep和fgrep

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

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

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

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

8awk是三兄弟系列之入門

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

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

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

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

13cut是修剪小能手

14wc幫你計算字數(shù)

15split是拆分小能手

16paste用來拼接

17sort命令上篇sort幫你排序

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

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

20加密工具全家桶

Shen基礎(chǔ)及工具篇

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

的,包括了:

?今天的主角是Shell

?用chsh來改變Shell

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

?read,傾聽是一種美德

?expr,一款多功能計算器

?tmux給你帶來多窗口的享受

?用alias起個昵稱吧

?history是歷史的鏡子

?xargs絕對的護花使者

?time,你最懂時間

?sleep,睡眠也有學問

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

握配置history的各種方法

讓我們現(xiàn)在就開始Shell學習之旅吧!

1今天的主角是Shell

老婆問我什么是Shell

面對做會計行業(yè)的老婆,我沒有信心回答好這個問題。

但是對于閱讀本書的讀者們來說,相信大家都有計算機知識背景,所以,我還是很

有信心能夠解釋清楚的。

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

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

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

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

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

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

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

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

如果只用一張示意圖來說明什么是Shell的話,那么下面的這張圖再合適不過了。

圖1什么是Shell

一睹Shell的芳容

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

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

這樣:

[roc@roclinux

當我們輸入了一條命令之后,Shen會經(jīng)過一系列的處理環(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",這是一個顯示操作系統(tǒng)基本信息

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

chgrpxawk、ulimit、rm,等等。

下面來一起看一下Is命令的運行效果,如圖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命令的運行效果

對于Shell高手來說,交互式Shell不能完全滿足他們的日常需要,他們更善于把工

作和任務通過自動化方式來完成,所以,Shell腳本應運而生。

當把多個Shell命令按照一定的邏輯寫到一個文件中時,這個文件就可以被叫

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

世界上第一款Shell

開門見山,世界上第一款Shell,叫作ThompsonShell,于1971年誕生,1975年

開始廣泛傳播。那時很多閱讀這本書的同學或許還沒有出生吧。

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

那一年,貝爾實驗室參與到了一個意義重大的項目中,那就是和美國通用電氣、麻

省理工學院共同開發(fā)一個多用戶、多進程的操作系統(tǒng),產(chǎn)品代號為"Multics"。

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

Multics項目的開發(fā)中來。

不幸的是,由于進度緩慢,Multics項目在1969年擱淺了。而Thompson卻在這個項

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

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

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

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

得到了廣泛地傳播。

所以ThompsonShell也被叫作V6Shell。

那些年,我們一起追的Shell

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

經(jīng)追過的女孩。而作為Linux愛好者,有沒有你曾經(jīng)追過的Shell呢?

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

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

大浪淘沙過后,最終流傳下來的Shell,才是值得我們了解和學習的Shell,如表1

所示。

表1值得了解和學習的Shell

名稱全稱誕生于流行于

shBourneShell1977UNIX

(t)cshCShell1978UNIX

kshKornShell1983UNIX

bashBourneAgainShell1989Linux

zshZhongShaoShell(非官方說法)1990Linux

dashDebianAlmquistShell2002Linux

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

scsh、psh、mksh,等等。

zsh是中國人開發(fā)的么

我猜一定會有人問,zsh的全稱是ZhongShaoShell,難道zsh是中國人開發(fā)的

么?

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

Falstado當時有一位名叫ZhongSha。的助教,他登錄LinuxShell時使用的ID是

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

選擇了zsh作為自己編寫的Shell的名字了。

是不是很有趣呢,我們再來講一個有關(guān)csh的故事。

回到遙遠的1978年,那時的Billjoy(BSD操作系統(tǒng)作者、TCP/IP設計者、vi作

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

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

叫CShell,是因為它的語法和C語言非常相似。

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

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

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

將它取名為tcsh,即TENEXcsho

讓Shell飛入尋常百姓家

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

流傳至今。

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

離地感受它們的設計思想和功能e

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

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

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

?/bin/sh:這是BourneShell0

?/bin/bash:這是BourneAgainShell。

/bin/nologin:這并不是一個Shell,而是指"無法登錄

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

[root@rodinuxecho$SHELL/bin/bash

可見,我們當前所使用的是BourneAgainShell。

如果想嘗試一下zsh,應該怎么安裝呢?非常簡單:

[root@roclinuxyuminstallzsh

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

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

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

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

Changingshellforroot.Shellchanged*

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

出當前shell,再以root賬戶重新登錄進來,就可以享受zsh啦!

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

可以評價下這些Shell么

我們不會把每種Shell的優(yōu)缺點都列在這里,因為曾經(jīng)追的很多Shell,現(xiàn)如今已不

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

里只簡單聊聊bash和zsh這兩種Shell,原因是,前者主流,后者強大。

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

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

Shell,所以大家也會看到,非常多的書籍、示例、項目都是面向bash的,本書也

不例外,畢竟,我們應該將有限的時間用在收益最大的事情上,對不對。

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

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

bash的同學來說,幾乎可以無縫遷移。而zsh在歷史記錄提示、命令補全、別名、

語法高亮等方面都有著超出預期的用戶體驗。

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

進行重點講解,來,一起進入下一篇!

2用chsh來改變Shell

我想知道我機器安裝了哪些Shell

chsh命令本身并不復雜,它的功能比較單一,就是負責展示和修改我們系統(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

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

查看當前正在使用的Shell

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

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

注意:SHELL一定要大寫??梢钥吹?,我們目前使用的Shell是bash。

聽說zsh不錯,于是我們就通過在命令行執(zhí)行zsh命令切換到了zsh環(huán)境。可是,為

什么查看當前Shell類型仍然是/bin/bash呢?

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

[roc@roclinux]~%

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

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

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

可以。

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

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

Password:Shellchanged.

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

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

這是因為chsh改變的是我們登錄Shell的配置,我們必須退出再重新登錄Shell,才

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

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

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

chsh-s到底修改了哪里

到了揭開迷底的時刻啦!

chsh-s其實修改的就是/etc/passwd文件中和我們所登錄的用戶名相對應的那一

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

[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)的時候,Linux

就會讀取這一命令來啟動新的Shell。

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

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

Password:Shellchanged.

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

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

我們直接進入正題,先來看看執(zhí)行export會輸出什么內(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)境變量了,滿滿的兩頁看來還真是不少呀。

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

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

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

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

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

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

程中。

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

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

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

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

是按變量名進行排序的。

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

量,該命令的輸出按變量名進行排序。

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

變量和自定義變量。

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

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

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

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

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

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

_=clear—>_=set

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

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

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

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

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

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

容:

[root@roclinux-]#echo$PATH

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

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

進行了分隔。那么,問題來了,這些路徑的作用是什么呢?

當用戶在Linux系統(tǒng)中直接輸入一個命令(如date命令),而沒有指定其絕對路徑

時,Linux就會求助于$PATH啦,Linux會依次進入到$PATH變量所指定的各個路徑

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

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

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

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

使用這些小工具時又不想總指定其絕對路徑,那么,我們應該怎么辦呢?沒錯,我

們應該把這個路徑追加到$PATH變量中去,具體的做法是這樣:

exportPATH=$PATH:/home/roc/operation_tools

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

后z當我們想使用這些運維小工具時,就再也不用指定絕對路徑啦。

讓你真正體會export的威力

不知道你是否注意到上面例子中的一個細節(jié),那就是我們在設置$PATH環(huán)境變量時,

使用了export命令。如果沒有使用export,會有什么問題嗎?

這個問題問得很好,這正好引出export的作用,那就是,使用export設置的變量就

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

下面我們通過一個示例來看一下:

#我們在當前Shell進程中指定了varl變量[roc@roclinuxvarl="hello"

[roc@roclinux~]$echo$varlhello#我們在當前Shell進程中又指定了var2

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

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

入到一個bash子進程中[roc@roclinux~]$bash變量仍然有效,而var2

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

[roc@roclinux~]$echo$var2#什么也沒有輸出

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

效,而自定義變量則無效。

誤操作惹的禍

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

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

令,就成這個樣子了,我該怎么辦???"

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

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

$exportPATH=/home/to/operation_tools

〃額,問題找到了,你的命令輸錯啦,來看正確的用法吧。

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

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

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

的誤操作啊!

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

4read,傾聽是一種美德

人生第一次編程

不知道你是否還記得你的第一次計算機編程。

我對"第一次"記憶猶新,那是一個很神奇的時刻。當我把有生以來編寫的第一個C

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

name:°

我懷著無比激動的心情寫下我的名字,然后按下回車。美妙的時刻就此凝固

了,計算機毫無差錯地顯示出:

welcome!!!roc.

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

本文就來幫你實現(xiàn)這個程序,在實現(xiàn)該程序之前,我們還是先來學習一下Linux系統(tǒng)

中最擅長傾聽的命令——read吧。

傾聽鍵盤的聲音

read命令用來傾聽標準輸入或文件輸入,并把信息存放到變量中。

從read命令的定義可以看出,傾聽鍵盤是read的主要職責之一。

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

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

"welcome!!!$name"exit0

就這么簡單,使用read命令來傾聽用戶的輸入,并把用戶的輸入內(nèi)容自動保存到指

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

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

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

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

!!!$name"exit0

上面腳本中的read的叩選項就是用來顯示提示語的。

在這個例子中,我們只是讓read來接收name變量的值,那么read可以同時接收兩個

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

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

echo"welcome$nameto$place"exit0

看到了嗎?read后面可以指定兩個變量name和place,當用戶輸入完成時,read會

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

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

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

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

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

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

[roc@roclinux./test.shpleaseinputyournameandplace:roc

welcomerocto

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

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

beijingshanghaitianjinwelcomeroctobeijingshanghaitianjin

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

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

值為空。

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

J=L

里。

還有一個非常特殊的情況,就是在編寫腳本時,如果read命令后面沒有寫任何變

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

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

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

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

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

yournameandplace:rocbeijingwelcomerocbeijing

傾聽也可以有時間限制

read,非常樂于傾聽用戶的聲音,但有的時候,用戶長時間不輸入,那read也可以

有自己的后手。

redd命令提供了選項,可以用來設置一個傾聽的時限。如果超過所設置的時限的

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

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

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

exit0

上面的腳本就使用了選項,用來指定等待輸入的時長(秒)。

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

么read就會自動結(jié)束,并顯示"sorry,tooslow"來抱怨一下用戶。可見,read

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

密碼輸入場景

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

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

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

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

"hehe,yourpasswordis$password"

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

信息。

這樣,是不是再也不用擔心密碼被別人看到了?

內(nèi)容來自文件

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

在說鍵盤,下面就來說文件。

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

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

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

第一種方法:使用-u選項

#!/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<&-

上面的腳本通過°exec3<test,txtw生成了編號為3的文件描述符,接著通

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

述符。

我們來看下腳本的執(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

請注意上面的用法"cattest.txt|whilereadline",通過這樣的方式來遍歷

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

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

Line3:19246finishedLinenois1

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

???

上面這個問題,是由于管道導致的。我們知道,管道的兩邊一般需要新建進程,當

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

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

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

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

第三種方法:使用重定向

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

種方法可以有效規(guī)避因為新建進程而導致的變量值無法保留的問題。

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

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

is$count"exit0

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

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

3:19246finishedLinenois3

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

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

神奇的換行符

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

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

可以看到,我們在前兩行的后面分別加上了一個反斜線(\),這個符號表示續(xù)行

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

如果我們把這個文件作為上面例子的輸入,那么會輸出什么呢?我們來看一下實際

效果:

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

nois1

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

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

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

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

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

不想讓它們起作用的話,請使用選項吧。

#!/bin/bash#assignthefiledescriptortofileforinputfd#3

isI

溫馨提示

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

評論

0/150

提交評論