天天看點

shell總結

<b>1.</b><b>基本</b><b>unix/linux</b><b>指令</b><b></b>

(1) chmod,chown,chgrp

作用:修改權限

格式:chmod [who] operator [permission] filename

who:u(檔案屬主) g(同組使用者) o(其他使用者) a(所有使用者)

operator: +(增權重限) -(取消權限) =(設定權限)

permission:r(讀) w(寫) x(執行) s(檔案屬主群組set-ID) t(粘性位*) l(給檔案加鎖,使其他使用者無法通路)

(2) touch

作用:建立一個空文檔

格式:tough myfile

注解:tough myfile将建立一個檔案myfile

(3) find

作用:搜尋檔案

格式:find pathname -options [-print -exec -ok]

-print:find指令将比對的檔案輸出到标準輸出

-exec:find指令對比對的檔案執行該參數所給出的shell指令,相應指令的格式為'command'{} /;

-ok:作用和-exec作用相同。隻不過每一步執行都需要使用者的确認

-options:(主要的)

-name:按檔案名查找

-perm:按檔案權限查找

-prune:使find指令不在目前指定的目錄中查找

-user:按照檔案屬主查找

-group:按照檔案所屬組來查找

-mtime -n +n,按照檔案的更改時間來查找,-n表示檔案更改時間距現在n天以内,+n表示檔案更改時間距現在n天以前;此外,還有-atime,-ctime選項,和-mtime選項類似

-type:查找某一類型的檔案,諸如:b(塊裝置檔案),d(目錄),c(字元裝置檔案),p(管道檔案),l(符号連結檔案),f(普通檔案)

-size n[c]:查找檔案長度為n塊的檔案

例:

在目前目錄及其子目錄中查找所有的"*.txt"檔案

find . -name "*.txt" -print

在目前目錄下查找檔案權限位為755的檔案,即檔案屬主可以讀、寫、執行,其他使用者可以讀、執行的檔案

find . -perm 755 -print

在目前目錄下查找除目錄以外的所有類型的檔案

find . ! -type d -print

用ls -l 指令列出所比對的檔案

find . -type f -exec ls -l {} /;

在/logs目錄中查找更改時間在5日以前的檔案并删除它們

find logs -type f -mtime +5 -exec rm {} /;

(4)echo

作用:顯示文本行或變量,或者把字元串輸入到檔案

格式:echo string

給出提示符,并輸入值給變量name

echo "What's your name:/c"

read name

 (5)read

作用:讀入值給變量

格式:read var

例: read name 從鍵盤讀入字元到name變量

(6)cat

作用:顯示檔案

格式:cat filename

 (7)grep(全局正規表達式)

作用:允許對文本檔案進行模式查找,如果找到比對模式,grep列印包含模式的所有行

格式: grep [options] 基本正規表達式 [檔案]

常用options值:

-c 隻輸出比對行的計數

-i 不區分大小寫(隻适用于單字元)

-h 查詢多檔案時不顯示檔案名

-l 查詢多檔案時隻輸出包含比對字元的檔案名

-n 顯示比對行及行号

-s 不顯示不存在或無比對文本的錯誤資訊

-v 顯示不包含比對文本的所有行

例:grep "sort" *.doc 在目前目錄下所有的.doc檔案中查找字元串"sort"

grep "48&lt;tab&gt;" data.f 抽取字元串後有一個&lt;Tab&gt;鍵

grep '[0-9]/{3/}/.[0-0/[3/}/.' ipfile 要抽取其中所有nnn.nnn的IP位址(原文印刷錯誤?)

(8)awk

格式: awk [-f field-separator] 'command' input-file(s)

=====================================================================================

awk條件操作符

操作符 描述 操作符 描述

&lt; 小于 &gt;= 大于等于

&lt;= 小于等于 ~ 比對正規表達式

== 等于 ! 不比對正規表達式

!= 不等于

awk内置變量

------------------------------------------------------

ARGC 指令行參數個數

ARGV 指令行參數排列

ENVIRON 支援隊列中系統環境變量的使用

FILENAME awk浏覽的檔案名

FNR 浏覽檔案的記錄數

FS 設定輸入域分隔符,等價于指令行-F選項

NF 浏覽記錄的域個數

NR 已讀的記錄數

OFS 輸出域分隔符

ORS 輸出記錄分隔符

RS 控制記錄分隔符

注:awk中所采用的正規表達式的符号要比grep和sed多兩個:+(比對一個或多個字元),?(比對模式出現率)

awk '{if($4~/Brown/) print $0}' grade.txt 如果field-4包含了Brwon,列印該行

awk '$3 == "48" {print $0}' grade.txt 精确比對,如果field-3等于了 "48",則列印該行

awk '{if( $1=="p1" &amp;&amp; $4=="p2" ) print $0}' grade.txt 同時滿足兩個條件,則列印該行

awk '{if( $1=="p1" || $4=="p2" ) print $0}' grade.txt 隻要滿足其中一個條件,則列印該行

<b>2.</b><b>檔案名的比對</b>

特殊的比對符号:

* 比對檔案名中的任何字元串,包括空字元串

? 比對檔案名中的任何單個字元串

[...] 比對[]中包含的任何字元

[!...] 比對[]中非感吧号!之後的字元

顯示所有以.doc結尾的檔案名

ls *.doc

顯示以cl開頭,後面跟任何字元串,最後以.sed結尾的檔案名

ls cl*.sed

顯示任意兩個字元開頭,接着是r,後面跟任何字元的檔案

ls ??r*

顯示以i或o開頭的檔案名

ls [io]*

比對所有以log.開頭,後面跟随一個數字,然後可以是任意字元串的檔案名

ls log.[0-9]*

比對所有以log.開頭,使用[!0-9]來表示非數字開頭的字元串

<b>3.</b><b>文本過濾</b>

基本元字元集及其含義

^ 隻比對行首

$ 隻比對行尾

* 一個單字元後緊跟*,比對0個或多個此單字元

[] 比對[]内字元。可以是一個單字元,也可以是字元序列,用-表示範圍

如用[1-5]代替[12345]

/ 用來屏蔽一個元字元的特殊含義。如$ . ' " * ^ | ( ) / + ?

. 比對任意單字元

pattern/{n/} 用來比對前面pattern出現次數。n為次數

pattern/{n,/}m 含義同上,但次數最少為n

pattern/{n,m/} 含義同上,但pattern出現次數在n與m之間

^$ 比對一個空行

^.$ 比對隻包含一個字元的行

compu*t 比對字元u 0次或多次,這個可比對computer,

A/{2/}B 比對字母A出現兩次,并以B結尾

A/{2,4/}B 比對字母A出現2到4次之間

<b>4.</b><b>特定</b><b>shell</b><b>變量</b>

$# 傳遞到腳本的參數個數

$* 以一個單字元串顯示所有向腳本傳遞的參數。與位置變量不同,此選項參數可超過9個

$$ 腳本運作的目前程序ID号

$! 背景運作的最後一個程序的程序ID号

$@ 與$#相同,但是使用時加引号,并在引号中傳回每個參數

$- 顯示shell使用的目前選項,與set指令功能相同

$? 顯示最後指令的退出狀态。0表示沒有錯誤,其他任何值表明有錯誤

其他:$0(腳本名字) $1 $2 $3 ...$9

<b>5.shell</b><b>輸入與輸出</b>

<b>5.1</b><b>檔案描述符</b>

檔案描述符 檔案

0 輸入檔案——标準輸入

1 輸出檔案——标準輸出

2 錯誤輸出檔案——标準錯誤

注: 标準輸入是檔案描述符0,它是指令的輸入,預設是鍵盤,也可以是檔案或其他指令的輸出

标準輸出是檔案描述符1,它是指令的輸出,預設是螢幕,也可以是檔案

标準錯誤是檔案描述符2,它是指令錯誤的輸出,預設是螢幕,也可以是檔案

<b>5.2</b><b>重定向</b>:&lt;,&lt;&lt;,&gt;,&gt;&gt;

command&gt;filename 把标準輸出重定向到一個新檔案中

command&gt;&gt;filename 把标準輸出重定向到一個檔案中(追加)

command 1&gt;filename 把标準輸出重定向到一個新檔案中

command&gt;filename 2&gt;&amp;1 把标準輸出和标準錯誤一起重定向到一個檔案中

command 2&gt;filename 把标準錯誤重定向到一個新檔案中

command 2&gt;&gt;filename 把标準錯誤重定向到一個檔案中(追加)

command &gt;&gt;filename 2&gt;&amp;1 把标準輸出和标準錯誤一起重定向到一個檔案中(追加)

command &lt;filename &gt;filename 2 command指令以filename檔案作為标準輸入,以filename2檔案作為标準輸出

command &lt;&amp;m 把檔案描述符m作為标準輸入

command &gt;&amp;m 把标準輸出重定向到檔案描述符m中

command &lt;&amp;- 關閉标準輸入

#############################################################################

#! /bin/sh

# f_desc

#把檔案描述符4指定為标準輸入,然後打開stock.txt檔案

exec 4&lt;&amp;0 0&lt;stock.txt

#讀入2行文本

read line1

read line2

#作為标準輸入的檔案描述符4被關閉

exec 0&lt;&amp;4

#顯示兩個變量的内容

echo &amp;line1

echo &amp;line2

<b>5.3</b><b>管道</b>: 指令1|指令2

who | awk '{print $1"/t"$2}'

<b>6.</b><b>條件測試</b>

格式1:test condition

格式2:[condition]

檔案測試狀态

-d 目錄 -s 檔案長度大于0,非空

-f 正規檔案 -w 可寫

-l 符号連結 -u 檔案有suid位設定

-r 可讀 -x 可執行

<b>組合測試:</b><b> -a </b><b>邏輯與</b><b> -o</b><b>邏輯或</b><b> !</b><b>邏輯否</b>

例: [-w results.txt -a -w scores.txt

echo $?

檢查上面兩個檔案是不是都是可寫的

<b>字元串測試</b><b> string_operator </b><b>可為</b><b>=(</b><b>相等</b><b>) !=(</b><b>不相等</b><b>) -z(</b><b>空串</b><b>) -n(</b><b>非空串</b><b>)</b>

格式1:test "string"

格式2:test string_operator "string"

格式3:test "string" string_operator "string"

格式4:[string_operator string]

格式5:[string string_operator string]

<b>數值測試</b><b> numeric_operator</b><b>可為</b><b> -eq(</b><b>相等</b><b>),-ne(</b><b>不相等</b><b>),-gt(</b><b>大于</b><b>),-lt(</b><b>小于</b><b>),-le(</b><b>小于等于</b><b>),-ge(</b><b>大于等于</b><b>)</b><b></b>

格式1:"number" numeric_operator "number"

格式2:["number" numeric_operator "number"]

<b>7.</b><b>指令執行順序</b><b> &amp;&amp; ,||, (), {}</b>

<b>&amp;&amp;</b><b></b>

格式:指令1 &amp;&amp; 指令2

說明:指令1傳回真(即傳回0,成功被執行)後,指令2才能夠被執行

例:/apps/bin目錄将會被移到/apps/dev/bin目錄下,如果它沒有被成功的執行,就不會删除/apps/bin目錄

mv /apps/bin /apps/dev/bin &amp;&amp; rm -r /apps/bin

<b>||</b>

格式:指令1 || 指令2

說明:指令1未執行成功,那麼就執行指令2

例: 拷貝檔案沒成功的話,就顯示錯誤.

cp word.txt word.bak || echo "cp file failed!"

<b>() {}</b><b></b>

格式:(指令1;指令2;...) {指令1;指令2;...}

<b>8.</b><b>控制流結構</b> if...then...else...fi,case,for,until,while,break,continue

<b>1)</b><b>傳回碼</b><b></b>

觀察:echo $?

退出:exit n (n為一數字)

break n ==&gt;跳出指定的循環個數。如break 2則跳出2個循環

continue ==&gt;跳出循環目前步

<b>2)</b><b>流控制</b><b>if...then...else...fi</b>

if condition1

then

command1

elif condition2

command2

else

command3

fi

<b>例</b><b>1</b><b>:</b><b></b>

##############################################

# ifwr

LOGFILE=test.txt

echo $LOGFILE

if [ ! -w "$LOGFILE" ]; then

echo "You cannot write to $LOGFILE " &gt;&amp;2

<b>例</b><b>2</b><b>:</b><b></b>

# ifcp

#下面用2&gt;&amp;1重定向标準錯誤,去除了系統産生的錯誤和系統輸出

if cp myfile myfile.bak &gt;/dev/null 2&gt;&amp;1 ; then

echo "good copy"

echo "`basename $0`:error could not copy the files " &gt;&amp;2

<b>例</b><b>3</b><b>:</b>

#将腳本參數傳入系統指令

#此處檢測目錄是否為空

DIRECTORY=$1

if [ "`ls -A $DIRECTORY`" = ""] ; then #也可用 if [$# -lt 1] 來代替判斷語句

echo "$DIRECTORY is indeed empty"

echo "$DIRECTORY is not empty " &gt;&amp;2

<b>3)case</b><b>控制流</b><b></b>

case語句為多選擇語句。可以用case語句比對一個值與一個模式,如果比對成功,執行相比對的指令。

格式:

==========================================================================

case 值 in

模式1)

指令1

....

;;

模式2)

指令2

esac

注:每一模式必須以右括号結束,取值可以為變量或常數。

比對發現取值符合某一模式後,其間所有指令開始執行直至“;;”

取值将檢測比對每一個模式,一旦模式比對,則執行完比對模式相應指令後不再繼續其他模式。

如果無一比對模式,使用星号*捕獲該值,再接受其他輸入

模式部分可能包括元字元,與在指令行檔案擴充名例子中使用過的比對模式類型相同,即

*(任意字元),?(任意單字元),[..](類或範圍中任意字元)

例1:

# caseterm

echo "choices are..vt100,vt102,vt220"

echo -n "enter your terminal type :"

read TERMINAL

case $TERMINAL in

vt100|vt102) TERM=vt100

vt220) TERM=vt220

*) echo "`basename $0`:Unknow response" &gt;&amp;2

echo "setting it to vt100 anyway,so there"

TERM=vt100

export TERM

echo "Your terminal is set to $TERM"

例2:

# caseparam

if [ $# !=1 ] ; then

echo "Usage:`basename $0` [start|stop|help]" &gt;&amp;2

exit 1

#assign the parameter to the variable OPT

OPT=$1

case $OPT in

start) echo "starting..`basename $0`"

stop) echo "stopping..`basename $0`"

help)

*) echo "Usage:`basename $0` [start|stop|help]"

<b>4)</b><b>循環</b>

<b>for</b><b>格式</b>

for 變量名 in 清單

do

.....

指令n

done

注:清單可以包含替換,字元串和檔案名

例1:

# for_i

for loop in 1 2 3 4 5 #for loop in "orange red blue grey"

echo $loop

例2:

# for_ls

for loop in `ls `

例3:

#for params,不使用in清單選項時,實際上等價于

#for params in "$@" 或

#for params in "$*"

# for_param

for loop in "$@" # 也可以是"$*," 這可以從指令行中取得參數

<b>until(</b><b>不常用</b><b>)</b><b>格式</b>

until 條件

例1:監視檔案系統容量,當它達到一定水準時通知超級使用者

# until_mon

LOOK_OUT=`df | grep /logs | awk '{print $5}' | sed 's/%//g'`

echo $LOOK_OUT

until ["$LOOK_OUT" -gt "90" ]

echo "Filesystem..logs is nearly full" | mail root

exit 0

<b>while</b><b>格式</b>

while 指令

例1:從檔案中讀取資料,使用重定向以保證從檔案中讀取資料

#########################################################################

#! /bin/sh | SAVEDIFS=$IFS

# whileread | IFS=:

while read LINE | while read NAME DEPT ID

do | do

echo $LINE | echo -e "$NAME/t $DEPT/t $ID"

done &lt;names.txt | done &lt;names.txt

| IFS=$SAVEDIFS

上面右邊使用IFS将域分隔符改為;号而不是空格或tab鍵

測試資料names.txt:

Louise Conrad:Accounts:Acc889

Peter James:Payroll:PR483

<b>死循環格式</b>

while :

指令

# menu

#set the date,user and hostname up

MYDATE=`date +%d/%m/%Y`

THIS_HOST=`hostname -s`

USER=`whoami`

#loop forever !

# clear the screen

tput clear

# here documents starts here

cat &lt;&lt;MAYDAY

---------------------------------------------------------------------------

User:$USER Host:$THIS_HOST Date:$MYDATE

1 : List files in current directory

2 : Use the vi editor

3 : See who is on the system

H : Help screen

Q : Exit Menu

MADAY

# here document finished

echo -e "/tYour Choice [1,2,3,H,Q] &gt;"

read CHOICE

case $CHOICE in

1) ls

2) vi

3) who

H|h)

this is the help screen,nothing here yet to help you !

MAYDAY

Q|q) exit 0

*) echo -e "/t/007Unknown user response"

echo -e -n "/tHit the return key to continue"

read DUMMY

繼續閱讀