ĤRShell M Shell Script


{ SHELL

£^\M\hHwgťL shell bash oǦWrMDzO_D̨sOFFOS

^q¦`ѤWaRҦqOѵwMncMwNOjaNo۬ݱoMҦpRLNNCPUNONwСNC}FwMҿתqOsbM]ӨtΪJMXH£dBⳣ}wCаݡRpGSLMzO˨ϥ£dqSOMzzLLiïâJMH£\qݨ쪺XMuo\઺MOn骺\ҡCӪtdMoǵwi淾qnMNOҿת֤(kernel)Mkernel LJMM CPU iBzM̫N浲GX캷WCMMFLM~MҦw鳣o kernel 䴩~ϥ£TC

Mkernel Sp󪾹DڭLJFOOSNOڭ̳o̤Ъ shell ҭtdƱFC]qҳBzƾڡMOGi쪺XMMڭ̤HߺDϥΪyܤ@ˡC×áMJ pwd ROMڭ̪DoO print working directory N(D`²ïâHy)M@ kernel ӻMäD pwd OMkernel u|ݾXMoɭԡMshell N|ڭ̱N pwd ½Ķ kernel zѪ{XCҥHMڭ̦bϥ£dqɭԡM򥻤WNOM shell DMӤOM kernel qM󤣬OwC

²ӬݡMڭ̴No˨Ӭݫݥ̪YRqrӸѪRܡMshell NOߡMkernel NO֡Cn@ӪG@ˡMzĤ@ݨ쪺NOߡMߥ}~ݪ̭֡Cshell NOϥΪ̩M kernel ɭMNϥΪ̤URO½Ķ kernel BzMYpUϡR

ڭ̦b shell J@өROMshell |շjөROMù䤤@ǯSrŰXBzMpGJ CR r( Enter ) ɭԡMNխվROMø kernel CӤ@몺ROâZ(syntax)jPpUR

# command parameter1 patrameter2 ...

UROۤvﶵ(options, q`£T - Ÿa)MiJ]iHJMpGSB~wMROq`ۤvw]ﶵQӰѼ(argument)hU{nDөwMǫYMǤ]w]ѼơCҦp "ls -l" oөROMﶵO -l (long list)Mӹw]ѼƫhOeؿCbRO椤AﶵMѼƳQ٬Ѷ(parameter)C

ڭ̸g`ͨ쪺 LinuxMO kernel oMӦb kernel ~MhOUئU˪{MuMX_Ӥ~@ӧ㪺 Linux oMCLצpMLinux kernel u@(ަ\hPM Linus Tovalds td@)M kernel ~ shell o\hءMҦp bourne ShellNC ShellNKorn ShellNZsh ShellNMڭ̳̱`IJ쪺Ws BASH (Bourne Again SHell)M GNU ҥ[j@ burne shell M ]Ojh Linux M󪺹w] shell CP shell Uۦ䤣PuIMziHۦo譱ƨӬݡMڳo̴N@@ФFC

BASH ouq shellMҥH|QUj Linux Mĥάw] shellMFO open source {~Mjj\ӬOlޤjaإn]@CBASH \ܦhMbСMUuC|䤤@ֳӤwR

ROɥ\R
zJROɭԡMziHJؿɮת}rMMtabNzRO|ɥC×áMzn ls @U /etc/sysconfig oӥؿe(]zwgb /etc ؿUF)MziHuJ ls sy MᱵsU tab MMN|N /etc/ ؿUҦH sy }YɮשMؿܥXӡMz£^\iHݨ sysconfigNsysctl.conf Nsyslog.conf oTӵGQpGzuJ ls sys AU tab ܡMGOO@˪M]b /etc/ ؿUMҦH sy }YɮסM 3 ӦrO s ӨS䥦rFQpGzJ ls sysc AƳoӰʧ@MܵGNѤU sysconfig M sysctl.conf ӤwM]H sysc }YuoɡMpGzA ls sysco @ tabMN|zN sysconfig oӰߤ@H sysco }Yɮ׸ɥC

pGzҿJ|MOߤ@Mun@U tab NɥM_hM|ť@U beat nMoɱzAɤ@U tab MN|NҦH|}YɮצCXӡQpŸɮפӦhMt£b|NŸɮ׼ƥاiDzMҦp 242 possibilitiesMMz y ~ܡMpG n hzW[ROJMMziHƳoǰʧ@MzҿJ|uѰߤ@M~iH£V@ tab ɥC

P˪Moӥ\]iH£XbJROɭԡM×áMznJ Xconfigurator ROMzuݿJ Xc M@U tab NiHFTO_ܤKOS ^_^

TipR tab ӸɥROMKtMӥB]OIC]MpGze|JTM tab O৹ɥMoiHקKzJ~|Ӱ~{CڱjPijzC@өRO`ե tab ɥ\MHTO䥿TʡC(hVo tab SaB)

ROOR
CzJ@өROMë Enter 椧MzoөRONQsbROO(command history)MӨCөRO@ӰOXMziH historyROӬݬݷeROvCoˡMzun£XVWVMNiH̦IsXz̪ҿJROMUVhh^̷sROMzQnsJROMMA Enter YiC

LM]@UKQkRziHJ !nnn (䤤 nnn O history RO쪺ROOX)MNw©ROFQpGzJ !! A Enter ܡMNOƤW@өRO(MVWVA Enter @)QpGzJ !ls ܡMhO̫@ ls }YROMpGO !cd NOW@ cd }YROMpQpGz Ctrl M R 䤧MMJzHegJLROM|MWЪɥ\@ˡMNzHeJLROɥ_ӡC~~ ӼF`աT

Bash |Nzn᪺ҦRObO cache ̭MMMunz\hXo shell MoǰON|saؿ ~/.bash_history oɸ̭(p߬ݡMOH . }Yɮ׮@M]NOɬO]Mzn ls -a ~ݱoC) LMoɥuO@wƶqROOӤwMziHzL $HISTFILESIZE oܼ(ڭ̰W|ܼ)Mo£YɮתOƶqC

alias \R
b Linux ̭MziHzL alias (OW) \MөwqX@өROw]ѼơMƦܥ£Wt~@ӦW٨²Ƥ@өRO(ΰѼ)CpGzJ alias oөROMzN|ݨثe alias ǡCz£^\|ݨ䤤@ӡR alias rm='rm -i' oMNORpGz rm oөROMt£dڰïâRO|aW -i ѼơM]NOH interactive ҦiMGObziRɮתɭԡM|gLzT{~uRCbYǨSo alias t£VMz rm Ӥtw -i ܡMNLnLNzÜöɮ׵ÉÖCp߮@Mb Linux WMɮפ@RNSkϦ^FTҥHM£Vߪt£TM|zo aliasC

bt~@ر£VUMzo{YǪRO|g`ϥ£ZMr_Ӯ¡PЪMzNiH alias ӸѨMC×áMzCnJROO shutdown -h now o@MzJ which shd (تOTw{ROW)MpGzèSo{oөROX{bzRO|ܡMziHJ alias shd='shutdown -h now'MMAJ shd NiHFTLM{bnÝÉTT]zo˯u|@~~ бz alias 䥦ROݬݡS

pGzn@ aliasMiHϥ unalias ROMpRunalias shd C

@zNzs alias MziHקz ~/.bashrc oɡMN[b䥦 alias ROQpzQt£VWҦϥΪ̳oo alias MNN /etc/bashrc ̭aC(pGzثe٤|sɮסMN^W@ɲ vi a:-)

jj script O
L DOS B͡M@w|D batch ɮת\Mb BASH iHz@tCھڱP_ROM\ DOS batch jjhFCb᭱M|ԲӰQ shell script 򥻧ޥC
ƹWMbash ٦\hF`\MȫФFM٬OdzۤvhMFC

ܼ

ٰOoW@̭MڴgLRڭ̵nJtΪɭԡMNo@ shellMӥB]ڤ@Ӧ{MMAJROݩo shell l{CpGzDz߰ӤߡMo{ڭ̪ shell b /etc/passwd oɸ̭]wM]NOb]w̫@Mw]O /bin/bash C

ƹWMڭo@ shell Mڭ̤~uMt£bqMҦpJzRONz{NCz]iHbo@ shell MAiJt~@ shell (]NOҰʤ@Ӥl{)MM٥iHAiJ`@h shell (AiJl{l{)MzJ exit ~h^W@ shell ̭(h^W@Ū{)Cpzwg\ŪLW@һLl{MӤzѡCLMz欰]OLMӥBM\h]wƥowqCҥHMzo shell ɭԡMPɤ]o@ҳ]wM£e٬ܼ( Environment variables)C

ҿת ܼ( variable )MNOίSwW(£g)Os@w]wȡMMѵ{NӨϥ£TCҦpMm=chen QW=kenny M򡥩mMWNOܼƦW١M chen M kenny NOܼƩҫOsȡC shell ҩwqM޲zܼơMڭ̺٬ܼơM]oܼƥiH shell ҲͪҦl{ϥ£TCܼƦW٤@볣£VjgrܡMҦpMڭ̱`ΪܼƦoǡR

ܼƦW NN
HISTCMD eROOXC
HISTFILE ROOsɮסC
HISTSIZE ROOnC
HOME w]naؿC
IFS w]jŸC
LINENO eROb shell script ơC
MAIL lHc|C
MAILCHECK ˬdl󪺬ơC
OLDPWD WiJؿ|C
OSTYPE @~tC
PATH w]ROj|C
PPID { PIDC
PWD eu@ؿ|C
SECONDS e shell ҰʮɶC
SHELL e shell |C
TMOUT ۰ʵnX̰~mɶC
UID ϥΪ̤ UIDC
$ e shell PIDC
S ̫@өRO^AC

pzQݬݳoܼƭȬOMunbܼƦW٫e[W@ӡ$ŸMM echo ROӬdݴNiHFR

# echo $PWD
/root
# echo $$
1206
# echo $?
0

Ĥ@өRONONeؿ|ܥXӡMMz pwd ROGO@˪QĤGөRONeo shell PID ܥXӡM]NO 1206CpGzoɭԿJ kill -9 1206 ܡM|Ne shell ÉÖMzNnsn~ot~@ shellMӥ PID ]OsQĤTROOW@өRO^ARpGROQMèS~Mq`O 0QpGROJ~M^AhOD 0 Mȵ{]p̦өw(ڭ̦b᭱ shell script ɭԷ|)C̫@өROM@UpUGR

# ls mbox
mbox
# echo $?
0
# ls no_mbox
ls: no_mbox: No such file or directory
# echo $?
1

z|o{RĤ@RO\MҥH^AO 0 QӲĤGөROÝÍѡM^AO 1 Cp{]p̬P~]wP^AšMziHھڪ^ȱXDOؿ~ް_C

TipsRpGzg{ scriptMni@ӲߺDMC@ةROG]w^ACoD`nMרbi debug ɭԡCoӧڭ̦b᭱Dz script ɭԦA͡C

ڭHɳiH£V@ = () өwq@ӷsܼƩ£Yܤ@ӭ즳ܼơCҦpR

# MYNAME=kenny
# echo $MYNAME
kenny

pzn@өwqnܼơMMziHϥ unset ROR

# unset MYNAME

LMܼƪSʤ@MOVXC]NOR@ shell SwܼơMubo shell ̭ϥ£TCpGznɵP@ shell ̭䥦{NscriptNROϥ£TM£W̪l{ϥ£TMz export RONoܼƶiXCLצpMpGzb@Ӥl{wqF@ܼơMoܼƪȡMuvToӤl{H£Wۤvl{Mӥû|v{£V{ͪ䥦l{C

×áMzb@ӵ{wq@ӷsܼơM£Yܤ@ӭ즳ܼƭȡMb{ɭԡMҳ]wܼƧQQpGzQNܼƭȤɵӵ{Ҳͪl{Mz export RO~OdoܼƭȡMDl{t~swqCLצpMe{ҩwqܼƭȡMOLkǦ^{䪺CpUR

width="60%" valing="bottom"> width="60%" valing="bottom"> width="60%" valing="bottom"> width="60%" valing="bottom"> width="60%" valing="bottom"> width="60%" valing="bottom">
# MYNAME=kenny
# echo $MYNAME
kenny
# export MYNAME
# ]w@ܼơC
#
# e]wȡC
# export XܼƭȡC
# /bin/bash # A}@ shellM]NOiJl{C
# echo $MYNAME
kenny

#

# Od즳]wȡC

# export MYNAME=netman
# echo $MYNAME
netman

# swq]wȡMPɤ] export XC

#
# ܼƭȳQsȨNC

# exit

# hXl{M^{C

# echo $MYNAME
kenny

#

# {ܼƭȨèSܡC

ܼƪt@ӯSʡMOܼƭȬOiH~C]NOMziHN@ܼƭȨӳ]wt~@ܼƦW١C×áR

# FIRST_NAME="Kenny"
# MYNAME=$FIRST_NAME

# echo $MYNAME
Kenny

# wq@ܼơC

# Awqt@ܼơMȬOĤ@ܼơC

#
# ĤGܼ~ӤFĤ@ܼƪȡC

t~MbwqܼƪɭԱz٭n`N@dzWhR

  • wqܼƮɡM=SťQ
  • @ܼƪW١MuOrMƦrMHƦr}YQpGW٤ӪMiH£T_jQ
  • wwqܼƧjgM۩wqܼƥiHVXjpgMHnϧOQ
  • u Shell wqܼƤ~٬ܼ;
  • pGܼƤaSršM£T\ŸQ
  • pGܼƤaťաMϥ£V޸M£aiC

ⶵM£^\ڭ̦AǨҤl|@UR

# TOPIC='Q & A'

# £^޸OdSŸMť

@

# Q1=What\'s\ your\ \"topic\"\?

# echo $Q1
What's your "topic"?

@

# \ NSŸ(t޸)MťոX

#

# MSŸMťճOdUӡC

@

# ANS="It is $TOPIC."

# echo $ANS
It is Q & A.

@

# ޸Odܼƭ($)

#

# ޸MܥXܼƭȡC

@

# WRONG_ANS='It is "$TOPIC".'

# echo $WRONG_ANS
It is "$TOPIC".

@

@

# £^޸OdSŸMť(PĤ@)

#
# £^޸MOdQPɡR

# $ ]@ŸOdMӫDܼƭȡC

@

# ALT_ANS='the $TOPIC'\ is\ "'$TOPIC'"\.

# echo $ALT_ANS
The $TOPIC is 'Q & A'.

@

# PɲVX޸N޸NMr \

#

# ޸OdQ޸OdܼƭȡQ
# \ NSŸXӡC

ڳo̸@U̫᭱ҤlnFR'the $TOPIC is '"$TOPIC"\.C£^޸N 'the $TOPIC is ' oqrAnM䤤 3 ӪťM@ $ ŸQM޸Od $TOPIC ܼƭȡQ̫ \ pIC

bޥ " " M ' ' ŸɭԡM򥻤WM ' ' ҥ]AeM|ܦ@rMSrųhS\Mܦ@rŦӤwM䤤Aϥ ' ŸMӦb " " MhS ' ' YMYǯSršMҦp $ MMOdۥS\Cz@@UMݬ echo ' "$HOME" ' M echo " '$HOME' " tOC

TipsRb shell ROïârš \ ڭ̷|g`£Z쪺CҦpMz@өROӪM@UhiWL@MάOQn䪺JROMz£^\Q Enter VU@~JCOMzV Enter 䪺ɭԡMƹWOJ@ CR (Carriage-Return) ršM@ shell Ū CR ršMN|հoөROCoɡMzNiHbJ Enter eJ \ ŸMNN CR rŤ]XӡMo shell N|WROFCo˪ROMڭ̦b script g`ݨMzDNNC

pGMzQ@ܼƭȶiLoMҦpRMY_FILE=' ~/tmp/test.sh' MӱzQNܼƭȴ test.sh (]NONe|h)MziHN $MY_FILE ${MY_FILE##*/}CoO@ܼƭȦrLoR## O£ZӤܼƫeݳMM */ O諸 (]NOr / )MMN̪RCziHѦҦpUdҡR

FNAME="/home/kenny/tmp/test.1.sh" ɭԡR

ܼƦW NN G
${FNAME} ܼƭȪC

/home/kenny/tmp/test.1.sh
${FNAME##/*/} ܼƭȶ}ݡMpGH /*/ }YܡMÉÖ̪C

test.1.sh
${FNAME#/*/} ܼƭȶ}ݡMpGH /*/ }YܡMÉÖ̵uC

kenny/tmp/test.1.sh
${FNAME%.*} ܼƭȥݡMpGH .* ܡMÉÖ̵uC

/home/kenny/tmp/test.1
${FNAME%%.*} ܼƭȥݡMpGH .* ܡMÉÖ̪C

/home/kenny/tmp/test
${FNAME/sh/bash} pGbܼƭȤ sh ܡMNĤ@ sh bashC

/home/kenny/tmp/test.1.bash
${FNAME//sh/bash} pGbܼƭȤ sh ܡMN sh bashC

/home/kenny/tmp/test.1.bash

zFܼƶiLo~Mz]ܼưXNMܨܼƭȡR

@ rS]w Ŧr DŦr
ϥ£dw]
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
ϥ£Z䥦
var=${str+expr} var=expr var=expr var=expr
var=${str:+expr} var=expr var= var=expr
]ww]
var=${str=expr} str=expr

var=expr

str

var=

str

var=$str

var=${str:=expr} str=expr

var=expr

str=expr

var=expr

str

var=$str

X~
var=${str?expr} expr X stderr  var= var=str
var=${str:?expr} expr X stderr  expr X stderr var=str

@}l£^\zѤWӪ满NMuܲV~~ unh@ǽmߡMzNDϥ£VFC×áR

# expr=EXPR
# unset str
# var=${str=expr}; echo var=$var str=$str expr=$expr
var=expr str=expr expr=EXPR
# var=${str:=expr}; echo var=$var str=$str expr=$expr
var=expr str=expr expr=EXPR
# str=
# var=${str=expr}; echo var=$var str=$str expr=$expr
var= str= expr=EXPR
# var=${str:=expr}; echo var=$var str=$str expr=$expr
var=expr str=expr expr=EXPR
# str=STR
# var=${str=expr}; echo var=$var str=$str expr=$expr
var=STR str=STR expr=EXPR
# var=${str:=expr}; echo var=$var str=$str expr=$expr
var=STR str=STR expr=EXPR

# MYSTRING=test
# echo ${MYSTRING?string not set\!}
test
# MYSTRING=
# echo ${MYSTRING?string not set\!}
 
# unset MYSTRING
# echo ${MYSTRING?string not set\!}
bash: MYSTRING: string not set!

аOoܼƪߩʡMzng shell script ɭԴN|NܼƷdVäFCpzQݬݷe shell ܼƦǡMziHJ set ROQpGuQˬd export XӪܼơMiHJ export env (e̬O shell w]Xܼ)C

Bash ]w

o̡Mz£^\|ݡRshell ܼƦb̩wqOSiHվܡS

MĤ@ӰDڤjFѡMڲqO shell ]p̹w]wqnMڭ̤@no shell NFCLMĤGӰDMګoiH֩w_zRziHHɽվzܼơCziHbiJ shell £XbRO̭swqM]iHzL@ shell ]wɨӳ]wC

ڭ̬ݬݡMzbinɭԡMt£b|ˬdɮקaR

  1. /etc/profileRMt£b|ˬdoɡMHwqpUoܼơRPATHNUSERNLOGNAMENMAILNHOSTNAMENHISTSIZENINPUTRCCpGz| shell script (ڭ̫᭱AQ)MzӬݱoXoܼƬOpwqCt~M٫wF umask M ulimit ]wRumask jaӪDFM ulmimit OSO£Zӭ@ shell إߪ{ƥءMHקKt£c귽QLӡC̫Mٷ|ˬdð /etc/profile.d/*.sh scriptMziHlܬݬݡC

  2. ~/.bash_profileRo̷|wqn USERNAMENBASH_ENVNPATHC䤤 PATH F{ $PATH ~Mٷ|A[JϥΪ̬|Mz|o{ root Mqb|O@˪Q BASH_ENV OMJIݡMOU@ӭnˬdɮסR

  3. ~/.bashrcRboɸ̭MziHo{@ alias ]w(@~~ Ӧbo̡T)CMMz|o{@R. /etc/bashrc Cb shell script M£V@ӤpIMM@ӪťAVt~@ scriptMNOPɰ¾ì script ñĥ£Z̪ܼƳ]wC

  4. /etc/bashrcR򥻤WMo̪]wMOҦϥΪ̦bo shell ɭԳ|ĥΪCo̫wF@ terminal ]wMH shell ܦrŵC

  5. ~/.bash_loginRpG ~/.bash_profile sbMhϥ£^oɡC

  6. ~/.profileRpG ~/.bash_profile M ~/.bash_login sbMhϥ£^oɡC

  7. ~/.bash_logoutRoɳq`u@өRORclearM]NO⺷ܪeMCpGzQnbnX shell ɭԡM|@ǰʧ@MҦpRM{(pzϥ£Z{)N٭Ydz]wNάOYdzƥC

ziHzLקW쪺ɮסMӽվziJ shell ᪺ܼƭȡC@ϥΪ̥iHקaؿ( ~/ )ɮסMHiӤHƪ]wQӧ@ rootMziHק /etc/UɮסM]wja@ΪܼƭȡCܩ bash ܼƭȦp]wSܼơSUܼƪ\pSziH man bash ѦҤUơC

TipsR@zקF /etc/profile ~/.bash_profile ɮסMs]wnbUnɭԤ~ͮġCpGzQhXMSQϥ£bs]wMiH source ROӧR
source ~/.bash_profile

ROɦV

nFM۫Hzwgz shell @wFѤFCMMڭ̬ݬ shell W@ǩRO\aMoǧޥO@@Өt£e޲z򥻭nC䤤@NORROɦV (command redirection) M RO޽u (command pipe) C

b`JѳoӧޥeMڭ̤FѤ@U shell RO򥻷R

W N NN ]
STDIN 0 зǿJ L
STDOUT 1 зǿX
STDERR 2 зǿ~

椤OOڭ̦b shell @өROз I/O (XPJ)Cڭ̰@өROɭԡMŪJJ (STDIN)MMiBzM̫NGiX (STDOUT)QpGBzL{J~MRO]|ܿ~ (STDERR)Cڭ̥iHܮeo{R@몺зǿJMOqڭ̪LŪQӼзǿXMзǿ~Mqڭ̪ȹܡC

PɡMbt£VWMڭ̳q`£cXӥNUP I/ORSTDIN O 0NSTDOUT O 1NSTDERR O 2C

zFѦU I/O NMҥNXMڭ̬ݤpUROGR

# ls mbox
mbox
# ls mbox 1> file.stdout

Фp߬ݲĤGөRORbRO᭱hF@ 1 MӺ򱵵(SťաT)O@ӤjŸ (>)MMOt~@ɮצW١COMWoSܩRO浲GM]NOR STDOUT FT쩳oͤƱFOS

M۫Hz|o֧ѰOF STDOUT NO 1 aTSFM]ڭ̳o̱N 1 £V@ > Ÿɨ@ɮפFCGLORڭ̱NзǿXqܨɮפMҥHڭ̦bȹNݤ STDOUTMӭ STDOUT GhOsbjŸk䪺ɤFCHMzݬݳoɮתeNDFR

# cat file.stdout
mbox

ڭ̥£V@ > NRO STDOUT ɦV@ɮתɭԡMpGɮפsbMh|إߤ@ӷsɡQpGɮפwgsbMMoɮתeN STDOUT GCɭԡMz£^\QOd즳ɮתeMӱNGW[bɮץݦӤwCziHh[@ >M]NOϥ >> NOFCziHۤvݮ@~~Mq`Mڭ̭nN@ǩRO£j~OUӡM£^oӤkC

TipsRpGzƱ > N~\@ӭ즳ɡMziHoөROR
set -o noclobber

LMiH >| ӱjgJC

WeҤlMڭ̫wF I/O 1 (STDOUT) i歫ɦVMo]Ow]ȡMpGzSwNMNOi STDOUT ɦVMҥH 1> M > O@˪Q1>> M >> ]O@˪CpGzϥ£VFƦrMƦrM > @w঳ťզsbC

nFMUAөROR

# ls no_mbox
ls: no_mbox: No such file or directory
# ls no_mbox 2>> file.stderr
 

M۫H£YڦhFaS(pGɮפsbM>> M > |إ߷sC)

ƹWMbڭ̪`޲zMɦVάOD`MCڥu|UoӨҤlNnFR

ڭ̶i֤߽sĶɭ(ڭ̤U@A)M|֪ܥXdWUHQ䤤jO STDOUTM]ǬO STDERRCDzuF`M_hzGXǬO`HMǬO~HCznsĶѡMէ~ɭԡMpGwgN STDERR ɥXӡMND`KFR

# make dep clean bzImage modules 1>/dev/null 2>/tmp/kernel.err &

o̡Mڤ@@TӥR(1) NзǿXe@ӥs null ]ƤWMpGzOʰnMڦbeÑr륦¬}RҦFih᳣|ÇڭӤHߺDMڷ|ıosĶ֤߮ɶ]XӪHMpGzP쪺ܡMOUMҥHڱN STDOUT ɨ null hMbQ (2) MMڱN STDERR ɨ /tmp/kernel.err oɥhMROMڴNiH쨺̬ݬݨsDCǰDiणOܭnMǫhiݭnsAs֤ߡMݱzgաC(3) ̫MڱNROe background (~~ ۫Hz٨SѰOaT)C]MsĶ֤߳ɶMҥHڱNeIhMo˧ڥiH~򰵨䥦ƱC

TipsRoɡM]t£VӦFMitפW|CǡMpGzuܦbNMҼ{ make nice level C(ѰO򰵤FS½ݫe@a)

eҤlMڭ̬O}N STDOUT M STDERR ɨ줣PɮץhMMڭ̯_̳ɨP@ɩOSMOiHMФUTR

# make dep clean bzImage modules >/tmp/kernel.result 2>/tmp/kernel.result
# make dep clean bzImage modules >/tmp/kernel.result 2>&1
# make dep clean bzImage modules &>/tmp/kernel.resultt

ڳo̧iDzRĤ@ïâRO򥿽TM]o˷|yoӿXPɦbm@ɮסMgJǫCӲ 2 M 3 ïâGO@˪MݱzwέӮâZFCLMnpߪOR& Ÿ᭱঳ťM_h|NROeIMӤON STDOUT M STDERR XC

nFMeڭ̳b STDOUT M STDERR ɦVMMڭ̬O_୫ STDIN OS

MiH~~~

ǩROMڭ̰椧M|b̵L STDIN JMJ EOF (Ctrl+D) Ҥ~|uROC×áMbP@Өt£VWMpGhϥΪ̦PɵnJܡMziH write ROVSϥΪ̰eXuTCӵuTeNOLVJrMoɭԩRO|iJJҦMzCJ@ë Enter MTN|bt~@ݡMz Ctrl+D ~}õROC

# write user1
Hello!
It is me... ^_^
How r u!
(Ctrl+D)

o˳q`ݭn@ǮɶJMpbgFMdݬYǸƪɭԡMNܲVáCoɭԡMz£^\iHNuTegb@ɮ׸̭MҦp greeting.msgMMo˿JNiHFR

write user1 < greeting.msg

NoˡMo̧ڭ̥£VpŸ (<) ӭ STDIN C²aS^_^

LMڭ̥ cat ROإ²ïâɮתɭԡMoOϥ > ŸR

cat > file.tmp

z Ctrl+D MqLJ STDINMNOsb file.tmp FCзQQݬ|pS(ڦb LPI ҸդILoDDخ@~~~)

pipe

drMpipe oӭ^OޡN޹DN޽uNCMMROSosOS²ïâM@өRO޽uMNON@өRO STDOUT @t@өRO STDIN C

Mo˪Ҥlڭ̫ewgIhFMҦpW@ tr ROɭԡR

# cat /path/to/old_file | tr -d '\r' > /path/to/new_file

WoөROMƹWөRORcat M tr MboөROMڭ̥£V@ | Ÿ@oөRO޽uM]NON cat RO STDOUT @ tr RO STDIN QMMtr RO STDOUT > ɨt~@ɮץhC

WuO@ӫD`²ïâҤlӤwMƹWMڭ̥iH£XhӺ޽ushӵ{M̲oڭ̽TQnGC×áRڷQDثeh֤Hnbt£VWR

# w | tail +3 | wc -l

ڭ̤Ū@UoөROR(1) w RO|ܥXen̪귽ϥ£\pMåBC@ӵn̦@Q(2) A tail RO 3 }lrQ(3) M wc -l pXơCoˡMNiHDenHƤFC

\hBͥثeĥ£g ADSL WMCsu IP @ˡMunzL²ïâRO޽uMzNiHNe IP XӤFR

  1. ڭ̤[ ifconfig ppp0 oөROXGR
    # ifconfig ppp0
    ppp0      Link encap:Point-to-Point Protocol
              inet addr:211.74.48.254  P-t-P:211.74.48.1  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
              RX packets:5 errors:0 dropped:0 overruns:0 frame:0
              TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3
    

  2. o{ IP }Ҧbylۨ䥦ylҨSrRinet addr CMMڭ̴Ni grep oXӡR
    # ifconfig ppp0 | grep "inet addr"
              inet addr:211.74.48.254  P-t-P:211.74.48.1  Mask:255.255.255.255
    

  3. AӡMڭ̥άۦPjŸNylƦCMMX IP }ҦbCC

    Mo̡Mڭ̥iH£T : ӤX 4 CQ]iHΪťӤX 5 C(Ŧ]yl}NO@Ӫť)CpGΪťӤܡMѩ󦳨ǶjhӪť䪺]MMڭ̥iH tr ROMNhӪť䶰X@ӪťR

    # ifconfig ppp0 | grep "inet addr" | tr -s ' ' ' '
     inet addr:211.74.48.254 P-t-P:211.74.48.1 Mask:255.255.255.255
    
    (`NRb ' ' O@ӪťT)

  4. M cut ROX IP ҦbCMӤ߼Ƥ@ơMӬO 3 CR
    # ifconfig ppp0 | grep "inet addr" | tr -s ' ' ' ' | cut -d ' ' -f3
    addr:211.74.48.254
    

  5. Mڭ̥£T : ACM 2 CNO IP FR
    # ifconfig ppp0 | grep "inet addr" | tr -s ' ' ' ' \
    	| cut -d ' ' -f3 | cut -d ':' -f2
    211.74.48.254
    

o̡Mڭ̤@@ 5 pipe N 4 өROs_ӡMNXe IP }FCO_ܦn£[OS

bP@өRO̭X{hөRO£TMF | ~M£^\z|ݨ " ` ` " ŸM]NOM ~ P@䪺Ÿ(Ϋ Shift )CO@ϥΪM䤤iH]A@ROM£[RO޽uCĪGMRO޽uSOOS

ڭ̨ϥ pipe N@өRO STDOUT ǵU@өRO STDINMϥ `` ɭԡMҲͪ STDOUT STDERR ȧ@RO椤@ӰѼƦӤwCMpݬݤUROnFR

# TODAY=`date +%D`
# echo Today is $TODAY.
Today is 08/17/01.

qGڭ̥iHݥXMڭ̥ `` N date oөROA_(itѼ)M򥦪浲GiH@ TODAY ܼƭȡCڭ̬Ʀ٥iHN@RO޽u£XbROWR

# echo My IP is `ifconfig ppp0 | grep "inet addr" \
    | tr -s ' ' ' ' | cut -d ' ' -f3 | cut -d ':' -f2`

My IP is 211.74.48.254.

NRĤ@ïâ CR Q \ FMҥHoөRO桥ݰ_ӡCڤҥH˳oMOiDzo `` ŸiHAΪdC

TipsRbܼƤϥ `` iHNRO浲GܼƭȪCƹWMF `` ~Mz]iH£^o˪âZRVAR_NAME=$(command) MOM VAR_NAME=`command` GO@˪C

Fo `` M | ~M٦t~@ӲŸ ; ӤjROCLMoӤ²RNOĤ@ROMAĤGөROMpR

# ./configure; make; make install

~~ pGzzw˵{HߡM£VW@RONFT

Shell Script

ڭ̹ shell ܼƩMROâW@w{ѤMMڭ̴NiHռgۤv shell script o~~ oiOD`nӤSNPƱOT^_^

b linux ̭ shell script iuOLBbRڭ̶}ïâ run level 򥻤WO@ script Qn᪺ҳ]wM]O script QƦܤu@Ƶ{MO@]O script CzHK /etc/rc.d/init.d ̭ӵ{^ӬݬݡMo{̳@Ӧ@PBRĤ@@wOpUo˪R

#!/bin/sh
£TR
#!/bin/bash

Mo̪ #! ᭱nwqNORO(command interpreter)MpGO /bin/bash ܡMUylN bash ӸQpGO /usr/bin/perl ܡMN perl ӸCPҨϥΪylyk@ˡMD`YMNPO shell ӸMP shell âZ]ȬۦPCҥHMpGzݨ script O /bin/sh ܡMNnpߤFRpGzJӬݳoɮסMƹWȬO@ link ӤwMǨt£[£^\|N link 䥦 shell hCpz script ylϥΪykO bash ܡMӳo sh o link csh M_ӥi|DCҥHM̦n٬Ow shell |w@ǡRbo̪dҳϥ /bin/bash ӧ@ script C

bu}lg script eMڭ̻{ script @ǰ򥻷R

²ӻMshell script ̭NO@sROӤwMA[WP_Ny{NjNޥMoa楿TROMϥ£WTѼƿﶵCMڭ̦b shell ̭JRO@ˡMshell script ]o˪SʡR

  • Ū@ CR rŪɭԡMNհӦROQ
  • |ťզQyleťթM tab ]z|Q
  • CR rŤ]P˥iH£T \ ŸQ
  • t~M # ŸOѲŸMqoӲŸܥylݪeQM{|ŪJoMڭ̸g`£ZӵϥΪ̾\ŪM]ӦWѡQ
  • C

@Ө}n script @̡Mb{}YɭԡM|£`ѻ script W١N£^~N@̡NNNHCpGzoӾ|gۤv scriptM]ӦoӨ}nߺDC

shell script ɪRWS@wWhMiHϥ£WɮצW(Ѧɮרt)MpGzwܡMiH .sh ӰɦWMLoOwʳWwCLMn@ shell scriptMϥΪ̥復v( x )M£Vs边sإߪɮ׳OS x permission MХ chmod RO[WCïâɭԡMD script wgܩ PATH ܼƤ|M_hzw|CҦpMzgF@ӥs test.sh shell scriptMbaؿM]o]Ozeu@ؿMz[W|~R./test.sh ~/test.sh CҥHMijzb script յL~Mb ~/bin ؿ̭MNiHbaۤv script FMMMznTw ~/bin wgX{bz PATH ܼƸ̭C

script ҥHoMb󥦯@DZi( test )CziH test ROM]iH if ԭzMҦpRtest -f ~/test.sh CNOդ@U ~/test.sh oɮ׬O_sbMo -f q`£XbɮפWաMFM٦ܦhR

NN
-G sbMåB GID Ұïâ{Ҿ֦C
-L sbMåBO symbolic link C
-O sbMåB UID Ұïâ{Ҿ֦C
-S sbMåBO@ socke C
-b sbMåBO block ɮסMҦpϺеC
-c sbMåBO character ɮסMҦp׺ݩ£eϱaC
-d sbMåBO@ӥؿC
-e sbC
-f sbMåBO@ɮסC
-g sbMåB SGID ݩʡC
-k sbMåB sticky bit ݩʡC
-p sbMåBO£[{ǰeT name pipe άO FIFOC
-r sbMåBOiŪC
-s sbMåBnj 0 (D)C
-u sbMåB SUID ݩʡC
-w sbMåBigJC
-x sbMåBiC

ƹWMoǴն٦ܦhܦhMziH man bash MѦ CONDITIONAL EXPRESSIONS Ct~Mڭ٥iHPɹɮ׶iաMҦpRtest file1 -nt file2 NO file1 O_ file2 nsCoشըϥΪҬOR

NN
-nt Newer ThanRĤ@ɮפĤGɮ׭nsC
-ot Older ThanRĤ@ɮפĤGɮ׭n¡C
-ef Equal FileRĤ@ɮשMĤGɮר곣OP@ɮ (p link)C

ڭ̳o̩һoǴաMu£ZӴɮסMӥBٱ`|£ZӤr (string)£gƦr()COrOSrӤдNO@rCb@ӴդM~/test.sh O@ɮסQ '~/test.sh' MhOb޸̭(޸޸)MNOrFC

bƦrMrW(£_)MҨϥΪҤjR

NN
=
!=
< p
> j
-eq
-ne
-lt p
-gt j
-le p£`
-ge j£`
-a ½æ
-o
-z Ŧr
-n DŦr

bW쪺襤MMǷN@ˡMϥ£^XoɬۦPCҦp = M -eq O󡦪NM = urM -eq hiH£ZӤrM]£ZӤܦ(ڭ̦b regular expression |I)C

ڭ̤ҥHniթ£VMDnO£ZӰP_Rpթ£V令ߡMN^@ӡu (true)_h^갲 (false)C]NORpG󦨥ߨN|ppQpG󤣦ߤS|ppMq script ҡzC򥻤WMڭ̪{ҥHoMOqo²P_}lC

×áMW -a (AND) M -o (OR) O£ZӴըӱRA M B CpGϥ test A -a B M A M B ߨ~ߡQpGϥ test A -o B Mun A B ߨNߡCܩ䥦MաMӧnzѧaS

t~M٦@ӯSŸR !ziण|B£TCO_NMҦpR"! -f"ODɮסQ "-ne" M "! -eq" O󡦪NC

ڭ̦bROWwgDpwqMܤ@ܼơMb shell script ̭NOqŨDFCӥBMV|QܼơMz script ONVCb shell script ҩwqܼƦYïâwqR

NN
-a wq}C (array) ܼ
-f ȩwq\ (function) W١C
-i wqơC
-r wq߿WܼơC
-x zLҿXܼơC

ڭ̰F = өwqܼƤ~M٥iH declare ROөTwqܼơCҦpR

# A=3 B="-2"
# RESULT=$A*$B
# echo $RESULT
3*-2
# declare -i A=3 B="-2"
# declare -i RESULT=$A*$B
# echo $RESULT
-6

zo̷|o{RpGSϥ declare RONܼƩwqƪܡM A M B ܼƭȳuOrӤwC

z{bwgDOܼơNpwqܼơNOrNpMզrMɮסModzO script 򥻧ޥCg@²ïâ script ӤDFMҦpbaؿg@ test.sh M䤺epUR

      1 #!/bin/bash
      2 # Purpose: a simple test shell script.
      3 # Author: netman <netman@study-area.net>
      4 # Date: 2001/08/17
      5 # Version: 0.01
      6
      7 CHK_FILE=~/tmp/test.sh
      8
      9 if [ ! -e $CHK_FILE ]
     10 then
     11         echo "$0: Error: '$CHK_FILE' is not found." ; exit 1
     12
     13 elif [ -d $CHK_FILE ];then
     14         echo -n "$CHK_FILE is a directory, and you can "
     15         test -x $CHK_FILE || echo -n "NOT "
     16         echo "search it."
     17         exit 2
     18
     19 elif [ -f $CHK_FILE ]; then
     20         echo "$CHK_FILE is a regular file."
     21         test -r $CHK_FILE && echo "You can read it."
     22         test -x $CHK_FILE && echo "You can execute it."
     23         test -w $CHK_FILE && echo "You can write to it."
     24         test -s $CHK_FILE || echo "However, it is empty."
     25         exit 0
     26
     27 else
     28         echo "$CHK_FILE is a special file."
     29         exit 3
     30
     31 fi
(`NRڥثe vi sMå :set nu NܥXӡMڪROOSƪC)

ڭ̬ݲĤ@R#!/bin/bashMNOwqX bash Oo script command interpreter C

MO@ǵѡMFo script £^~N@̡NNMTC

bѤM 7 ~O script u}lRwqX@ܼ CHK_FILE MثeeOaؿ tmp lؿ test.sh ɮסC

TipsRƹWMoөwqMpGzQ}oӳ]pMiHNo( 7 )UƦR
if [ -z $1 ]
then echo "Syntax Erro! Usage: $0 <file_path>" ; exit 5
else CHK_FILE=$1
fi

Ĥ@O}l@ if P_ROM@wn£V@ fi ROӵ(ziHb̫@쥦)QMb if M fi @ then ROCoOáw if-then-fi ޿P_RpGYY󦨥ߡMMppQ٦ if-then-else-fi P_RpGYY󦨥ߡMMppM_hppQt~M] if-then-elif-then-else-fi P_RpGYYߡMMppQ_hMApGYYߡMMppQpG٬OߡMNppC

WXMDnتON CHK_FILE oܼƭȩwq $1CSz£^\| $1 OڡSOzo script ɭԩҿJĤ@ӰѼQ $0 hO script ROÝóCҥHMo̬OP_@U $1 O_Ū ( -z )MMh(then)MiDzyk~MçiDzTâZMPɰhXMê^@ӪA(᭱A)Q_h(else)MNN CHK_FILE wq $1C

UӲ 9 MziHN "if [ ! -e $CHK_FILE ]" "if test ! -e $CHK_FILE " MN䳣O@ӴաCpG [ ] ܦ@Ӧan`NR"[ " k䥲Od@ӪťաQ" ]" 䥲Od@ӪťաC

bثeo script MP_޿pUR

  1. ˬd $CHK_FILE (]NO ~/tmp/test.sh o) O_sb( ! -e )MpG( if )󦨥ߡMNѦ then ̭ROQ_hѦҤU elif elseC

  2. pGW@BJߡM]NO ~/tmp/test.sh sbMMh echo ROiDzŪoɡMæPɪ^{@^A(ٰOoڭ̦beL $? ܼƶܡS)Mo̬ 1Cb script Mɭ԰ exit ܡMN|} scriptMޫ᭱O_٦䥦RO£YP_C]ڱNo echo M exit gbP@MҥH£V@ " ; " Ÿj}ӡM_hMziHN exit gbU@C

  3. U( 13 )O@ elif MNO else if NM]NORpGW@ if ߡMMbo̦At~@ if աCo̬O~ˬdoɬO_@ӥؿ( -d )MMhMizO@ӥؿMæPɹէiDzO_oӥؿijC

    MݬݤU@( 15 )ʤeMЯdNW@ echo Mo echoMa@ -n ѼơMNObܫHɭԤi_( newline )ʧ@MҥHMMUXb@_(@ 3 script )~OuܪeCo̦Ai@ӴաRݬݱzoӥؿO_㦳 -x vM_h|b "and you can" M "search it." [W@ "NOT"MpGvNX{o NOT C

    o̡Mڭ̨S if-then ӧP_MӬO || ( OR ) ӰP_RDYCob@²ïâP_D`n£TMרiHӻM]£WӦhrQ\NRP_u@өROӤwCF || ~Mz]iH && ( AND ) P_MMy Jack WRYou jump I jumpCҥHMoy]iHR
    test ! -x $CHK_FILE && echo -n "NOT " (rOקﳡ)C

    ̫Mھڥثeo elif ҶiïâҦRO槹MðhXo scriptMPɳ]w^A 2 C

  4. AU( 19 )Ot@ elif M]NORpGsW@ elif ]ߪܡMo~ˬdoɬO_O@ӱ`Wɮ( -f )MMhMiDzO@ӱ`WɮסMMMsiTӴաMOձzO_㦳 -rN-xN-w vMܡMOiDziʡC̫ˬdoɮת׬O_WL 0 ( -s )M_hiDzO@ӪɡCoǧP_MNhX scriptMê^@Ӭ 0 AC

  5. M( 27 )O@ elseMNOpGWҦ if M elif ߡMNݳo̪C]NORoɮ׬OsbMOؿM]O`WɮסMNO@ӯSɡCMhX scriptMó]w^A 3C

    boӽdҤMscript @@ 0N1N2N3 o|Ӫ^AMھڳoӪ^( $? )Mڭ̴NiHoˬdɮרsO@ӱ`WɡN٬OsbN٬OؿN٬OSɡC

  6. ̫MAS䥦ʧ@FMNo if P_C

ثeo script ȴѤ@ script zӤwMҦpRwqMϥܼơNif-then-else-fi P_NաN޿YNhXANCPɡMoӽdҤ]ѤF@ǰ򥻪 script ѼgDҡR£VPYƨӮѼgPP_ΰjCҦpo̤@@ if-then-else-fi P_MĤ@ ifNthenNelseNfi SYơMMM򱵳oǩRO᭱ԭzNiYơQIĤGh if-then-else-fi ɭԡM]pCƹWMëD@wpgkMpGz{VgVMz۵M|o˦wƪ~~

קڭ̻{ѤF@ if-then-else-fi P_MƹWMb script £VWM٦䥦\hP_ޥMbڭ̶}ojjM script eM{Ѥ@UR

case
âZR
case string in
	pattern)
	commands
	;;
esac

ھڤPrӰʧ@Mp£ZҤlӻnFR

      1 #!/bin/bash
      2 # Purpose: a simple test shell script.
      3 # Author: netman <netman@study-area.net>
      4 # Date: 2001/08/20
      5 # Version: 0.02
      6
      7 
      8 echo Please pick a number:
      9 echo "	"a, To show the local time.
     10 echo "	"b, To list current directory.
     11 echo "	"c, To see who is on the machine.
     12 echo -n "Your choice: "
     13
     14 read choice
     15
     16 case $choice in
     17                 a | A) echo -n "The local time is "
     18                    date ;;
     19                 b | B) echo "The current directory is $PWD ";;
     20                 c | C) echo "There are following users on the machine:"
     21                    who ;;
     22                 *) echo "Your choice is an invalid option." ;;
     23 esac

o script Oбz aNbNc rMA read ROqLŪJ choice ܼƭȡMMNoܼ£Xb case P_R

  • pGO a AR date ROQ
  • pGO b BR $PWD oܼܷeؿQ
  • pGO c CRh who ROQ
  • pGO䥦 ( * ) RhiDz invalid C

DzO_`NRC@ case ﶵM£V@ " ) " @ޡMMMbo case ̫@өROHM@wn " ;; " ӵC̫M٥ case ˼g esac oӧP_C

for
âZR
for item in list 
do
	commands
done

zݭnƳBz@ǨƪɭԡMfor jND`n£VFCq`£ZӭƳBz@ǦC( list ) ƪM×áz@ܼơM̭]tۤ@CMj|@ӱ@ӪiBzM̫@ӳBz~hXCpS£V@ӽdҨӻnFR

      1 #!/bin/bash
      2 # Purpose: a simple test shell script.
      3 # Author: netman <netman@study-area.net>
      4 # Date: 2001/08/21
      5 # Version: 0.03
      6
      7
      8 if [ -z "$1" ] || [ -z "$2" ] ; then
      9         echo "Syntax Error: Usage ${0##*/} <word to search> <target dir>"
     10         exit 1
     11 fi
     12 if [ ! -d $2 ]; then
     13         echo "${0##*/} : Error: $2 is not a directory."
     14         exit 2
     15 fi
     16 TWORD="$1"
     17 TDIR="$2"
     18 TFILE=`grep -r "$TWORD" "$TDIR" | cut -d ':' -f1 | uniq`
     19
     20 if [ ! -z "$TFILE" ]; then
     21         echo "You can find $TWORD in following file(s):"
     22         for i in $TFILE ;do
     23                 echo $i
     24         done
     25         exit 0
     26 else
     27         echo "Could not find $TWORD in any file under $TDIR."
     28         exit 3
     29 fi

o script Ob@ӥؿUjɮסMpGɮ׸̭o{wrMNNɮתW٦CXӡCnܼơRTWORD M TDIR MoܼƤO script 1 өM 2 ӰѼơC

@}lnˬdROO_ܼơM -z $1 M -z $1 ӴաMpG̨@SwMNiDzyk~MPɰhX(^Ȭ 1 ) CMAˬd $2 O_ؿMpGOؿMN]XĵiMðhX(^Ȭ 2 )CpGqLWDˬdMM£[RO grepNcutNuniqMNɮקXӡC`NRoNO for jݭnˬdCC

M|ˬdCO_eMpGܡMN for jӭܦC̭ҦءQ@@ӡMC̫@Ӷؤ]BzCoNO@ for j骺򥻹B@äDFCpGCSQإ߰_ӡMNiDz䤣zwrMðhX(^Ȭ 3 )C

while
âZR
while condition
do
	commands
done

oӰjZezѪR󦨥ߪɭԡMN@ơMCڭ̤}e case script ݬݡR

      1 #!/bin/bash
      2 # Purpose: a simple test shell script.
      3 # Author: netman <netman@study-area.net>
      4 # Date: 2001/08/21
      5 # Version: 0.02.1
      6
      7 
      8 while [ "$choice" != "x" ]; do
      9         echo
     10         echo Please pick a number:
     11         echo "	"a, To show the local time.
     12         echo "	"b, To list current directory.
     13         echo "	"c, To see who is on the machine.
     14         echo "	"x, To exit.
     15         echo -n "Your choice: "
     16
     17         read choice
     18         echo
     19
     20         case $choice in
     21                 a) echo -n "The local time is "
     22                    date ;;
     23                 b) echo "The current directory is $PWD ";;
     24                 c) echo "There are following users on the machine:"
     25                    who ;;
     26                 x) echo "Bye bye..."; exit 0 ;;
     27                 *) echo "Your choice is an invalid option." ;;
     28         esac
     29 done

Mڭ̥ while iӱP_RpG $choice ܼƭȤ x ܡMNưjMJ x ()Co script |@ܱzJﶵMMiBzMz x ~|C

until
âZR
until condition
do
	commands
done

o until nM while ۤϡRpG󤣦ߴN@ưjM󦨥߬CpG~ޥ£VWҡMuݱN while ]ۤϴNiHFR

קeR
      8 while [ "$choice" != "x" ]; do

קR
      8 until [ "$choice" = "x" ]; do

SRNOo²T

sub function
âZR
function function_name
{
	commands
}

£TR
function_name ()
{
	commands
}

zb@ script MgnFqiH£ZӳBzSw󪺵{M£^\᭱|ƥ£ZCMMziHƼgoǥylMKQkORNoǭƩʪyl sub functionCpGzҲժMNON@ǯ@ɪ{ҲաMMᴣѵݭn£Z즹\઺䥦{ϥ£TCbMݤ@ӵ{gHҲդƵ{סM]NݱoXoӤH{\OC

ڭ̤g@ script ܾثeҨϥΪdɭTMݬݸ̭ sub function OBΪ R

      1 #!/bin/bash
      2 # Purpose: a simple test shell script.
      3 # Author: netman <netman@study-area.net>
      4 # Date: 2001/08/21
      5 # Version: 0.04
      6
      7 
      8 # function 1: to get interface.
      9 getif () {
     10     until [ "$CHKIFOK" = "1" ] || [ "$GETNONE" = "1" ]; do
     11         echo -n "The interface (ethX) for $CHKNET network [Enter for none]: "
     12         read CHKIF
     13         if [ -z "$CHKIF" ]; then
     14             echo
     15             echo "There is no interface for $CHKNET network."
     16             echo
     17             GETNONE=1
     18         else
     19             chkif 	# invoke the second function
     20         fi
     21     done
     22 }
     23
     24 # function 2: to check interface.
     25 chkif () {
     26     TESTIF=`/sbin/ifconfig $CHKIF | grep "inet add"`
     27     if [ -z "$TESTIF" ]; then
     28         echo ""
     29         echo "ERROR: Could not find interface '$CHKIF' on your machine!"
     30         echo "       Please make sure $CHKIF has been set up properly."
     31         echo ""
     32         return 1
     33     else
     34         CHKIFOK=1
     35         getip	# invoke the third function
     36         return 0
     37     fi
     38 }
     39
     40 # function 3: to get ip.
     41 getip () {
     42     CHKIP=`ifconfig $CHKIF | grep "inet addr" | tr -s ' ' ' ' \
     43         | cut -d ' ' -f3 | cut -d ':' -f2`
     44     CHKMASK=`ifconfig $CHKIF | grep "inet addr" | tr -s ' ' ' ' \
     45         | cut -d ' ' -f5 | cut -d ':' -f2`
     46     echo
     47     echo "The interface of $CHKNET network is $CHKIF using $CHKIP/$CHKMASK."
     48     echo
     49     return 0
     50 }
     51
     52 # start of main body
     53 for CHKNET in EXTERNAL INTERNAL DMZ ; do
     54     getif		# invoke the first function
     55     unset GETNONE
     56     unset CHKIFOK
     57 done

bo script MثeT sub functionR

  • getif ()Ro̥ until jqLŪJwdCpG Enter ܨSɭMMhM^@ӫHMñN GETNONE ܼƳ]w 1 MPɰhXo functionQ_hMU@ function C

  • chkif ()RW@ function QŪJdW٤M|ˬdoӬɭO_sbCo̬O /sbin/ifconfig M grep ˬdMpGROG줣 IP }Mܳoid٨S]wnMMhM^@ӿ~HMðhX functionM^A 1 Q_hMU@ functionMMhX functionM^A 0C

    (`NRo̪ function ϥ return hXH£^]w^AQW@ function Sϥ retuenMO] getif () ϥ until jMpG̥ return ܡMN|_ until jC)

  • getip ()RW@ function qLɭ˴MNNɭ IP M netmask XӡMPɧiDzTM̫hX functionM^A 0C

Ҧ sub function wqMUӴNO main body }lCo̥£V@ for jMO EXTERNALNINTERNALNM DMZ iˬdMĤ@ function N}l@sꪺʧ@FC] sub function ̭ܼƷ|ƨϥ£TMҥHMbCϥ£dL䤤\धMnNYǼvTU@ӧP_ܼƲMšM unset ROYiC

ƹWM£Xb script Wj¹£D`hܤơMȧڤ]S\Oja@@СC٬OdݱzۤvhCCNFC

Regular Expression

`Wܦ (RE -- Regular Expression) ӬOҦDzߵ{Hƪ򥻥\ҡCMMڪ{OܮtMӥBo̪Ñr]OH{DMLMb᪺޲zͲPMpG|B RE ܡMNO\hƱɥb\MPɤ]zb޲zL{pKlCUMڭ̥uIJ̰򥻪 RE `ѡMܩiޥMNd쪺BͦۤvoC

Mڭ̻{ѳ̰򥻪 RE ŸR

Ÿ NN d
^ yle "^dear" RylH dear }YC
$ yl "dear$"RylH dear Q"^$" RťզC
\ r "\\" R\ ŸQ"\." RpIQ"\ " RťC 
. ÝËr ".ear" : iHO dear, bear, tearMO ear C
? e@ RE X{ 0 1

"^[0-9]?$" R ťզ£Wut 1 ӼƦrrC

* e@ RE iX{ 0 £Xh

"^.*" RҦrQ

"^[0-9][0-9]*$" R t@£XhӼƦrrC

+ e@ RE iX{ 1 £Xh

"^[0-9][0-9]+$" R tө£XhӼƦrrC

\{n\} be@rŪ n ӬۦPdr "^[0-9]\{3\}[^0-9]" Ryl}Ys 3 ӼƦrMMO@ӫDƦrC
\{n,\} be@rṲ̄  n ӬۦPd򪺦r "^[0-9]\{3,\}" Ryl}Y̤֭ns 3 ӼƦrC
\{n,m\} be@rŪ n m ӬۦPd򪺦r "^[0-9]\{3,5\}" Ryl}Ys 3 5 ӼƦrC
[list] CÝËr "t[ear]." RiHO tea, tar, try MO tim C
[range] d򤤥ÝËr "t[e-r]." RiHO tea, tim, try MO tar C
[^range] 󤣦bd򤤪@r "t[^e-r]." RiHO tarMO tea, tim, tryC

q`Mڭ̥£ZӳBz RE { grepNegrepNsedNawkNviNMU{ykM\ೣۮtܦhMݭnԲӬsL~NCbYǵ{MҦp egrep M awkM٥iHBzYǩršMҦpR" | " O RE £V@YQ" ( )" i£ZӲզXh RE QC쪺ܡMW\hƥiHoMҦp sֱL uWܦJP£TvtCÑrC

sed & awk

\hH RE ɭԡM֤FФ@U sed M awk o_M̳iH£ZӳBzrMBzkWoҤPCH sed r桦쪺BzKQ awk hbCBzWW쪺qCO_pMjaۤvoC

ڭ̥ݬ sed oӵ{MROykI vi ̭s\R

  • H@rӰROW١Q
  • ROһݪѼƸmROQ
  • ziHNƩ RE mROeMHSROnBzHC

sed `£[ROMаѦҤUR

RO yk
a a\ string br᭱W[Swr(s)C
c c\ string Nr¨SwrC
d d RrC
i i\ string breJSwr(s)C
p p ܦrCD -n Mw]|bBzܤlC
s s/oldstring/newstring/flag

£bsrªrC䤤iΪXЦR

gR椤Ҧ¦r(w]uĤ@)Q

pRܡQ

wfileRgJSwɮסC

ҦpMznJR

sed 1,3d src.file

ܪGMN|N src.file eTÉÖCpGzJR

sed '3,$d' src.file

oˡMܪGMN|q 3 ̫@ª_ÉÖMuѤU 1 M 2 ӤwC WROOѤF[޸M_hn \$ ӸCLMڱjPijz£^޸N sed ROA_ӡCpGznNťզÉ_M RE ӰD`²R

sed '/^$/d' src.file

b sed ̭ޥ RE ɭԡM q`|£Z / / ŸN RE A_ӡMM~OROC pGzQn󴫦rMNn s ROFR

sed 's/red/blue/g' src.file

oˡMҦ red r곣|Q blue QpGS[W g XСMuC@ïâĤ@ red QӤwC

F d M s RO~Mڭ٥iH a RObyl᭱sW@Mer곡Q£W i RObyleJ@Mer곡Q]iH c RON¬®r곡CLMzboXөROɭԡMn ' ' NROMѼƬA_ӡMM \ ŸbRO᭱ Enter MM~৹CM_ZzѪMp@@UaR

sed '$a \
New line appened at the end.' src.file

oˡMN|bɮ׳̫᭱W[@ylFCA×áMznN 3 ¬®t~rMiHo˪R

sed '3c \
The third line is replace with this line.' src.file

A×áMzQNzsxlɮ ~/mbox £`u}C@ʶlMiHo˸ոաR

sed '/^From /i \
\
-------------------------\
\
' ~/mbox

ڷQMzӤ|ѰOڭ̦beÑrM ifconfig | grep | tr | cut oǩRO޽uӧXdɭaCƹWMڭ̥ sed RO]@˥iHoP˪GR

ifconfig eth0 | grep "inet addr" | sed -e 's/^.*addr://' | sed 's/ *Bcast.*$//'

Ĥ@ sed ON addr: yler s ROLr(]NOb̫᪺ // Sr)QMĤG sed N Bcast sPeťաMylݤ] s Lr(`NR/ *Bcast / M * Oť)QoˡMѤUӪNO IP }FC

ثeMڭ̩ҶiïâROXMObWMJMzwgǷ|ROɦVFMnNGOs䥦ɮץhMOpϴxFaC ^_^

ܩ sed £YޥMziHpUnns@UR

http://www.ptug.org/sed/sedfaq.htm

Dz߹L sed Mڭ̦Aݬ awk oөROs򯫳qCNש| IP ҤlӻnFM awk ]@R

ifconfig eth0 | grep "inet addr" | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}'

o̪ awk M cut ROܬۦRM -F wqXjŸ(`NRĤ@өROΪťհjšMҥH -F ᭱ ' ' Oť)MMA print RONCXӡC awk ӨMܼ $0 NC@QBzyl MMĤ@O $1NĤGO $2N.... MpC

pGzH awk uవoǨƱMNbOӤpݥFTҦpzoˤ@Ӥr(dog.txt)M̭uo@rR

The brown fox jumped on the lazy dog quickly.

Mڭ̥ awk ӶiBzR

# awk '{ $2="black"; $3="dog"; $8="fox"; print}' dog.txt
The black dog jumped on the lazy fox quickly.

qWҤlMڭ̵o{ awk 㦳BzܼƪOMƹWM]ۤvتܼơR

ܼƦW NN
FS jŸ(w]Oť)C
NF eylƥءC
NR eylơC
FILENAME eBzɮצW١C

ƦܡMawk ٯiƭȤWR

ܼƦW NN
> jC
< pC
>= j£`C
<= p£`C
== C
!= C

t~MpGYӰïâܡMawk RO@@TӳRBEGINNmainNM ENDCb awk ROMBEGIN MO{}lɰ@Ǥ@ʪROQ END hb{hXɭ԰@Ǥ@ʪROQ main OMhHj骺£XvBzJC@ӻMڭ̵Lwq BEGIN M ENDMwq main NiH awk ROFCҦpR

# echo a b c d | awk 'BEGIN { x=1;y=2;z=x+y } {print $x $y $z}'
abc

oӨҤlIhlMȧ@ܽdӤwC]Mڭ̦b BEGIN wqF xNyNz ȡR( 1N2N3 )MMڭ̦AN $xN$yN$z (]NO $1N$2N$3 ) CޥXӡCҥHM浲GOĥ|ïâ d NSܤFC

AҦpMz@ɮ (result.txt)M䤺epUR

FName   LName   English Chinese Math
Kenny   Chen    80      80      50
Eward   Lee     70      90      90
Amigo   Chu     50      80      80
John    Smith   90      50      75

ziH£VUROMX Chinese ήïâWMӥuܨW(m)R


# awk '{ if ($4 >= 60) print $1" : "$4}' result.txt | tail +2
Kenny : 80
Eward : 90
Amigo : 80

pGzQܧ@YĤ@ylMiH pipe tail ROiLoCpMڭ̦AǧM×ápҦWïâZMåBH̫@CܥXӡMiHo˳]pR


# awk '{ 
total = $3 + $4 + $5
number = NF - 2
average = total/number
if (NR = 2) printf("%s\t%3.2f\n", $0, average)
}' result.txt
FName   LName   English Chinese Math    AVERAGE
Kenny   Chen    80      80      50      70.00
Eward   Lee     70      90      90      83.33
Amigo   Chu     50      80      80      70.00
John    Smith   90      50      75      71.67

oөROݰ_ӦIMݭn@UR

  1. Mڭ̥£V@ { } N awk ROA_ӡMMb~A[@ ' ' Mo˱ziHb޸V Enter NROhJC

  2. MwqF total ܼƬ 3N4N5 ïâ`M (]NO English + Chinese + Math)MHܼ number ƥش 2 (]NO NF - FName - LName )C

  3. MMȴNO total H number C

  4. ]ɮפĤ@O£ZӹB⪺MӥB٥A[W@ӥs AVERAGE YMҥHo̭£V@ if ӧP_ÚHO_֩ 2 (LMڦbժɭԡMo{ = 1 ӳ]wMڤ]DS)MMhM printf RO(`NRb print ᭱@ f r) MHwâZiܡCo̪âZORO@Ӧr ( %s )M]NO᭱ҹ $0 (yl) HrâZܡQMO@ tab ( \t )QAUӤSO@ӦrM]N᭱ "AVERAGE" (Dܼƭȥ " " A_)Q̫J@_Ÿ ( \n Mnewline N)Co̡Mz|o{MZO % ܪâZM̶ǹ᭱Qӥ \ }YMhOiHqLJŸC(£^\M}liݥXөҥHMMh@UMNo{WhաC᭱٦@ӽdҡC)

  5. UӪM| if P_ÚHO_j£` 2 (z]iH > 1 M]NOqĤG}l)MMhMA printf ROM %s\t%3.2f\n âZܡC䤤 %sN\tN\n ۫HzDFMu %3.2f SLӤwCwqXBIƦr( floating point )ܮâZORpI 3 ƩMpIkơCҥHoïââZOR£XrܾNM@ tab NMH 3.2 pIâZܫewqn average ܼơN̫O@_ŸR

                  %s                     \t   %3.2f  \n
    |                                  |    |      |
     Kenny   Chen    80      80      50       70.00
    |                                  |    |      |
                  $0                         average
    

  6. MO '{ }' oǬA£V޸M̫OnBzɮצW١C

ӨC@ïâXGMN|br᭱wâZ[W tab MȤFCO_ܯ_OSTMouO awk MָզӤwMYno awk jjOMȤwgOکүशЪFC

 

 


www.study-area.org © 2001

Netman H
Last Updated: Jan 17, 2004