<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<tab>" data.f 抽取字元串後有一個<Tab>鍵
grep '[0-9]/{3/}/.[0-0/[3/}/.' ipfile 要抽取其中所有nnn.nnn的IP位址(原文印刷錯誤?)
(8)awk
格式: awk [-f field-separator] 'command' input-file(s)
=====================================================================================
awk條件操作符
操作符 描述 操作符 描述
< 小于 >= 大于等于
<= 小于等于 ~ 比對正規表達式
== 等于 ! 不比對正規表達式
!= 不等于
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" && $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>:<,<<,>,>>
command>filename 把标準輸出重定向到一個新檔案中
command>>filename 把标準輸出重定向到一個檔案中(追加)
command 1>filename 把标準輸出重定向到一個新檔案中
command>filename 2>&1 把标準輸出和标準錯誤一起重定向到一個檔案中
command 2>filename 把标準錯誤重定向到一個新檔案中
command 2>>filename 把标準錯誤重定向到一個檔案中(追加)
command >>filename 2>&1 把标準輸出和标準錯誤一起重定向到一個檔案中(追加)
command <filename >filename 2 command指令以filename檔案作為标準輸入,以filename2檔案作為标準輸出
command <&m 把檔案描述符m作為标準輸入
command >&m 把标準輸出重定向到檔案描述符m中
command <&- 關閉标準輸入
#############################################################################
#! /bin/sh
# f_desc
#把檔案描述符4指定為标準輸入,然後打開stock.txt檔案
exec 4<&0 0<stock.txt
#讀入2行文本
read line1
read line2
#作為标準輸入的檔案描述符4被關閉
exec 0<&4
#顯示兩個變量的内容
echo &line1
echo &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> && ,||, (), {}</b>
<b>&&</b><b></b>
格式:指令1 && 指令2
說明:指令1傳回真(即傳回0,成功被執行)後,指令2才能夠被執行
例:/apps/bin目錄将會被移到/apps/dev/bin目錄下,如果它沒有被成功的執行,就不會删除/apps/bin目錄
mv /apps/bin /apps/dev/bin && 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 ==>跳出指定的循環個數。如break 2則跳出2個循環
continue ==>跳出循環目前步
<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 " >&2
<b>例</b><b>2</b><b>:</b><b></b>
# ifcp
#下面用2>&1重定向标準錯誤,去除了系統産生的錯誤和系統輸出
if cp myfile myfile.bak >/dev/null 2>&1 ; then
echo "good copy"
echo "`basename $0`:error could not copy the files " >&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 " >&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" >&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]" >&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 <names.txt | done <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 <<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] >"
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