Scripts
Scripts
Cyril Huang
uÌã
cyril@gyoza.homeip.net
1 G 5
2 $Bourne shell 7
2.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 shellÎ# . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2 Æshell scriptsubshell . . . . . . . . . . . . . . . . . . 9
2.2 óÐóÿà;¶® . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 ó¸à . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Srquote . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.3 ÀrÝóã . . . . . . . . . . . . . . . . . . . . . . 11
2.2.4 (ó . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.5 ×°/ó . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Ðó9jÿà; . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1 ÿà;P . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 ¥²I/ú . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.1 /ú . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.2 ²Iú . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.3 ó. . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 File descriptorI/O0' . . . . . . . . . . . . . . . . . . . . . . . 22
2.6 ø×?f . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6.1 ?f . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6.2 if f¾\ . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.6.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6.4 while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.6.5 case switch . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7
Portable Shell remote shell . . . . . . . . . . . . . . . . . . . . . 28
2.8 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3 Regular Express 31
3.1 +
-RE glob . . . . . . . . .
. . . . . . . . . . . . . . . . . . . 31
3.2 C-§ . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . 32
3.2.1 ÃÍC-î . . . . . .
. . . . . . . . . . . . . . . . . . . 32
3.2.2 C-§ ÀrPî . . . . . . . . . . . . . . . . .
- 33
3.3 C§ !Àrî
- . . .
. . . . . . . . . . . . . . . . . . . 33
3
CONTENTS CONTENTS
3.4 Pë(address) . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 greedyÝregular express . . . . . . . . . . . . . . . . . . . . . . . 34
4 sed 35
4.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Ð)fÝ addressing . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 pattern/hold space, regex9 f script j . . . . . . . . . . . . . 36
4.4 sed command ú . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4.1 Ãͼ . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4.2 pattern/hold space ݧ . . . . . . . . . . . . . . . . . . 39
4.4.3
×M . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5 awk 45
5.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 scriptà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3 óû§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3.1 /ó . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.2 awkó ó shell . . . . . . . . . . . . . . . . . . . . . 49
5.3.3 p ÐóArray split . . . . . . . . . . . . . . . . . . . . 50
5.4 ÃÍ×+° . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.1 ó.ìÕÐ . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.2 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4.4 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.5 function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6 ÍÐó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6.1 C§ ð -match . . . . . . . . . . . . . . . . . . . . 54
5.6.2 íáí§ print(f) . . . . . . . . . . . . . . . . . . . . . 55
5.6.3 Bó rand() . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.6.4 Ù system() . . . . . . . . . . . . . . . . . . . . . . . . . 56
6 perl 57
6.1 ÃÍ+°£]lV . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.1 ó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.2 f× . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2 ?powerÝregular expression . . . . . . . . . . . . . . . . . . . . . 58
6.3 ðàÐó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4 Ù§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.1 process . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.2 jn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.3 system call . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.5 module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
u`Äò·®
CONTENTS CONTENTS 5
C+°f´
ó
7 Bourne shell, perl 59
p
7.1 . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
fB
7.2 Hash . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
ff´ . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
]º×
7.3.1 61
]º . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4 . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.4.1 while 62
P
7.4.2 for loop
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Û
7.5 . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.6 . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
u`Äò·®
CONTENTS CONTENTS
u`Äò·®
Chapter 1
G
Í@ÎbàÃÍÝÌ9¯Í@ê µXÝ x
3 ( îÝ v|IYP¶® lPݶ®
scripts scripts
« %®ç°%® KàÕscripts
” ” configuration
7
CHAPTER 1. G
u`Äò·®
Chapter 2
$Bourne shell
2.1 +
2.1.1 shell Î#
shellÎ×Í#å¸àïú¡O®¼ÙÆÝ×ÍTàPbߺ
.shell ii3kernel²«Q¡3×·AP&f´Q!9Ëi°¦ E
y&¼1shellô©Î¨²×ËapplicationPÍ@¸«gimp, netscape
Î×øÝ©Îºlogin§¼X|Î|ðÝ×ËTà
P àC program¼9ø|Q¯Ý(ó
9
2.1. + CHAPTER 2. $BOURNE SHELL
bash -
ls
4GB 4GB
KERNEL
4GB-
cp
USER 0x000
-
rm
0x000 KERNEL
USER
4GB
- ENVIRONMENT
VARIABLES
KERNEL
4GB
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.1. + 11
¶×wshellÍ@&ðxÎRÕuserÆÝú¡àforkþ¨
×process Bunix likeÎ9ß9ÝQ¡39Íchild processàexecÆ
9Í ²IP»Als, rm...X|shell/Iݺ®ÃÎ9øÝ
1. shellP×"8ÇK
2. Æprompt¸àïíáú
3. RÕ¸àïíá
4. fork()×ͱprocess
5. exec()ú
6. Æ9Íúê/Õshell
39\
º:Õunix likeÝÆ×ÍPK΢ãexec9Ísystem call¼Æ
Ý 9ή¼Ù躸àïPÆPÝ^×system callÎuserP
«kernel Ú;ݰ×Ѽ
3|GMS DOS`×^¡ºÆcommand.com9wPµÎshell
µºþ
C:\>
¸àïíáú9ÍC:µÎèîÐr(prompt)bourne shell;ðpromptÎ$
©Ä9Ídos shell8 Ý-X| `bÍb(Ý4DOS9Íshell|
ã (4DOS9ÍshellÍ@JÝ9unixîshellÝ©P Q«ËÝunix
shellÎ f) A
©Îà¶×¶×°icon¡¼ÝMS-Windows`
XÝ`Ý command line shellµ%;Ý+«ãÝÄÆ¨×
ÍPÝ^×Î× øÎexec()
unix like ÝÙÝúøPÝshellÃÍîtÝÆ²Iúx|
”Õ”×°C¼Æ9°CscriptÝ?Î|'×°( .9Í
²Iú/)R¼W×® »A3Windowsì&Æôº'TMPDIR9
øÝê¼Õ£Íêb°windowsP º.ÆÝ×°õ`jnw3
9
unix likeÝshell scripts+°|bif, while, for loop¤g×°²I
ú|½(!`b!Ý' ¸ÿ×°^ð®î?ÿTT
WfÝdos shell?
ú
sed, awk....9°²IÌòòBÕÎýãÝunixÙÄnÝú
̵ winzipWNÍwindowsKºÝÌ9ÌÕÎWZÝ
/ BÃshell programmingÌÝ
2.1.2 Æshell scriptsubshell
ËË]°
• R±shellÆshell scripts
u`Äò·®
2.1. + CHAPTER 2. $BOURNE SHELL
3êGshellÆshell scripts
•
R¨×Íshell¼ÆÝscripts3scriptsjtG«G
#! /bin/sh
ÏÞË]°Îàú”.”TïsourceÆ
$ . test.sh
$ source test.sh
$ { test.sh; }
$ eval ’. test.sh’
-½3y×°'©b39ÍshellìÝÕóR¨×ÍshellµÎ¨×Í
8Ýt& ôµÎàÏ×Ë]°ÆÝscriptóÝ'ºÅ(
Õæ¼Ýshelló 9Í8 ¥ksh^bsource9ÍúX|t?
àsource Àr( )îà¨×ÍsubshellÀr{ }îàêGshell»A
$ ( VAR=’testvar’; )
$ echo $VAR
$ { VAR=’testvar’; }
$ echo $VAR
testvar
2.2 ó Ð óÿ à ; ¶ ®
2.2.1 ó¸à
óÂà
var="value"
var=’value’
var=‘command‘
.ÂJ¼ÍþÐr$
$ var="I am a gyoza"
$ echo $var
I am a gyoza
$ var=‘ls *‘
$ echo ${var}
$ var=’$var’
$ echo $var
$var
|î¥ÝÎè}Îb-½ÝbSrÝ!®à?ì:
2.2.2 Srquote
"8îÝdouble quote, single quote, backquotez½
• backquote ‘command‘ 9ÍÎúãy $(command) X|ðð
:Õvar=‘commandTïvar=$(command) µÎ.commandÆ'
var
• single quote 3’ ’/ÝZC;;1¹æøðb°1ºÐr3S
r /1º©L
• double quote 3” ”/ÝZC$ ‘ ”ëËLºð͸Ý1¹æø
• escape char 3\ ¡Ý×C-ô|1¹æø
2.2.3 ÀrÝóã
îÀr{}ÎparameterÝ]° ${var}Îf´?ݶ°A^bÍ
C|à$varµ? Tè}Îb-Ý ÍP¶®9è×Í
Kè×}Îb-Ý Íó×°à°
• ${var:-value} AvarbÂÝ£µàæÍÝÂQàvalueÝÂ
• ${var:+value} AvarbµàvalueÝÂ
u`Äò·®
2.2. óÐóÿà;¶® CHAPTER 2. $BOURNE SHELL
• ${var:?message} varb£µàæÍÝÂQµmessage ÂÕÇ
K¬v®
• ${var:%pattern} Apatternvar¡«ÝI Ù)F/yì^b Ù)
I var
• ${var:#pattern} ApatternvarG«ÝI Ù)F/yì^b Ù)
I var
• ${var/pattern/substitute} AvarbpatternÙ)µðWsubstitute
:×Í»
# remote shell $RSH ºy /usr/bin/rsh ARSH ^bÂ
RSH=${RSH:-/usr/bin/rsh}
9Ë]Pà3bPÝoption?à
|ì«9ÍP
»
# :+
ÎÏ×ÍF
¼Ý¢ó AbÂVARµà"-o $1"
# VAR
# $1
func()
{
VAR=${1:+" -o $1"}
}
9Ë|à3[ãCÝØI
»A TïbÝúã/Ý??ÎE5(
# :%
¬&Æ©t¡«Ý£Íjn(`|à9ͼ[ã
# find
b t?à;àsedf´1×F
# bourne shell
# ksh bash
PRIV_HOST=fermion-priv
PUB_HOST=${PRIV_HOST:%-priv}
ºy
echo $PUB_HOST
(PUB_HOST fermion)
BLOCK_DEVICE=/dev/vx/dsk/oracledg/vol_0
RAW_DEVICE=${BLOCK_DEVICE/dsk/rdsk}
2.2.4 (ó
û;Ýó ABourne shell, korn shellìà
$ export var
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.2. ó Ð óÿ à ; ¶ ® 15
J9ÍóµW×Í(ó3C
«Ý
main(int argc, char **argv, char **envp)
&Æ|3shell
'(ó9ÍÂÎNÍã9Íshell forkÝP
BãenvpK:ÿÕÝ9Íargv, envp¼ÝK3virtual memoryÝì«stack ?
îÝ:k®”àOpen Source toolss8” X|shellôÄ
Î×Í”User spaceÝC program”(ó3C image user spacetì«
ô|getenv9Ílibrary function callJÕ X|×'ó^b'
(ó^bð°.Â×å͸ÝP 9\¥ÝÎæÍÝBourne
shellÝexport^bYî
$ export var=value
2.2.5 ×°/ó
• $? G×ÍúÆÝstatus 0î^®Þ3P'
0
îFALSEôîNo ERRORX|PÝexit return§?
• $# îFshellÝargumentsó
• $0 9Íshellú(C
• $1 $2 $3 ... functionF
¼Ý¢óarguments
• $@ îfunction F
¼ÝXbargumentsºy ”$1” ”$2” ”$3”
• $* îfunction F
¼ÝXbargumentsºy”$1 $2 $3”
• $$ îêGÝprocess ID
2.4 ¥ ² I / ú
&ÆðàÝls, cp, sh....9°KÎ×ÍÆj8Ey×ͲIÆ
j shellb×°/Ýú3shell
«9°Îbuilt-inÝ/IúÎ
àC¶ shell9wP`µ¶3
«Ý cd, export9µÎ
bashÍ@b9|GݲIúKâ
¼®W/IúÝ»Aecho,
getopts Ä
ÝP÷P&ÆÎ.ÆÌ
²Iú9°/ú
|àenable, disable3bash/ã*ĽÝsh, kshT&µ^bÝ
T
2.4.1 /ú
f´¥vp×FÝ/úb
• : ¼#K®yCPU/ÝNOP¼
• eval I5༮Ëgóð
• exec ÆØËú¬vð*êGshell(æÍÝÆºð*shell)
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥ ² I / ú 17
• trap #ÕØËGrݧ
• shift argumentsݧ
: magic numbers Û
:΢¯Ý3UnixÙÆPºlãjnGÝC§ magic
numberÝBourne ShellÝÆmagic numberÎ : Î #! X|:Õ9Ë
|:Ýshell scriptµ¤QR¯!`:ôbßJ¼®Ûà à#Ý
9°êYÝshell scriptKÎÝ
eval ñ ^ C -
eval|J¼Æ×ÍúÄtðàÝÎJ¼®ËgóÝð x
ÎNgÆ×Íshell úºevaluate×g:Õb$9Íݵ.Âð×
g.óð* Q¡Æ×Å9Ëdouble scanÝ]°E×°óðb
à .
evalÎR¨×Íshell¼ÆÎ3ͼ9Íshell/9evaluate×
g X|ð|1ºì¼ »AA&ÆËgð
count=1
var1=I
var2=am
var3=a
var4=gyoza
while [ $count -lt 5 ]; do
eval "echo \$var$count"
let ’count=count + 1’
done
ÄAóH9(CºÆÚ
u`Äò·®
2.4. ¥²I/ú CHAPTER 2. $BOURNE SHELL
exec
º. êG Ý JÍ J*ðW¡«ÝúÍ@9µÎà
9Í Hð*ÝLÎ×øÝ tð:ÕÎ3 /.xinitrc9
exec ” ” shell process
Æ
scripts window manager
exec cmd
cmd9ÍúD3µº/Õlogin.
JÍshellðÕcmd¬Q^
bcmd9ÍÆj X|ÆPÝ]°ËËÎ×øÝ
$ exec cmd
$ cmd
Jº39\"8íáíáCW$input9ÍóÝÂ
set
set ÎJ¼'9ÍshellÝÆ(Ýf´¥ÝscriptºàÕÝÃ
• set -- Ñð:Õ-¡«Îoption¨3Îoption Î×Íú¢ó
A-1 -2 ...
• set -a 9\|¡óW(ó
• set -f Õj(Ý©C-»Awildcard *Õ
XbݤÝ
• set -x debug shell scripts
×àexitÒshell,ͼ¶Ctrl-D(eof)ô|
• set -o ignoreeof
• set -o noclobber n*I/O0'ãoverwritejn
• set -o notify shell@` ×background jobÝstatus
• set -o noglob n*wildcardC-Õ A * ? [ ]
• set +o .-oÝD'E®
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥ ² I / ú 19
n*-v -x –ëËó4
• set -
set -- Tïset - ððà3shell scripts
« set -o ÎðàÝ»Aset -o
vi'shellÝE®]Pàvi]° ã/îÍúµÎ¶ESC¶kC set -o
emacsµÎàemacsÝ]°
test
test Î×+°Ý?f9Í3ì«D¡
trap
RÕØÍsignal`shellÝET
;P
ÍsignoÎ
$ trap "command" signo
cyril@grill:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
»A
30) SIGPWR 31) SIGSYS
$ trap "" 2
$ trap "rm $TMPFILE" EXIT 1 2 15
u`Äò·®
2.4. ¥²I/ú CHAPTER 2. $BOURNE SHELL
}
9Í»ÝG«A8ÕEXIT9ÍsignalµÆscriptcleanÕexit $?Ýcode
µÎquote/Ý A$ TC INTERACTIVEÎèCµÆì«
Ýsignal§ t¡AÎSIGPIPE(13r)µ¢¯(Ar:)
shift
Îà¼.
¼ÝargumentsÉ×ÍÉ shift n ÉnÍÉ shift|J¼
àøÄ10Í|îÝargrments.
$1 ... $9©b9Í ¼:×ÍshellÝqueue
shift
listÝappend
2.4.2 ²Iú
b°²IúðàÕ
• basename J*j(ݧ
• echo messageÝ]°
• find 0jn
• getopts §F
¼Ýarguments«CÐP0Ýgetopt()
• xargs pipe`ÝúÆ¢óargumentsݧ
¨²sed awkºbÝ+Û
basename
Rj(j(Ì
$ basename foo.c .c
Jj( .c º*
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥ ² I / ú 21
echo
ÎÕÇKÝWð(ôbprint, printf|à) 9\ýÝÎsh,
/ÝechobashÝ×øX|'b°×ø
echo
ksh
ð(newline)
ÕescapeC-\cy-nà°
echo -n "messages"
getopt
getoptsÍ@Îksh, bashÝ/IúgetoptÎËݲIú 9 C
Ýgetopt():Í»
while getopts :dvt:n: c
do
case $c in
d)
DEBUG=yes
;;
t)
TYPE=$OPTARG
;;
n)
NUMBER=$OPTARG
;;
v)
VERBOSE=’yes’
;;
esac
done
ÍAr:Î19Í¢ó×b«½Ý¢óÂ^bAr dvî¡«^
bñ½¢ ó »Atð:Õ-vÎ1PÆ`Îverbose modeµÎ9ø
$OPTARGµÎ«3¡«Ý ¢ógetoptsQ&§?¬v×Í×ÍÝó
$OPTARG¼ôb$OPTIND«C libraryÝà°
find
´0jnàÝPú
u`Äò·®
2.4. ¥²I/ú CHAPTER 2. $BOURNE SHELL
0
find . -name "regex"
0
find / -type d directory
0
f plain file
0
l symbolic link
0
p named pipe file
0
b block device
c char device
find . -perm 755
find / -user cyril
gzip ‘find . \! -name ’*.gz’ -print‘
bÝshell\ .
!b©½L»Abashîã/|GÝú
not !
3script9`ÎKÎñ^C-®Þð:Õ\`KÕ9Îñ^C-
3script ()ôb©½LîR¨×Ísubshell¼ÆX|$Õ()`ôà
ñ^C-Tï)sed awk×R¸à`ôÎ×øÝ¼§
xargs
xargs à¼§×°í¼ ¨×ÍíáÝarguments$ÕÝ®Þ »A
# find /usr/include/ -name "*.h" | xargs -n 2 diff
-n2μbËË WíWdiffÝargumnets
# find /usr/include/ -name "*.h" | xargs grep ’#ifdef’
Ñð/ÎíÝ×rZ8Ýbàxargs`Î×Í×Í;¡«Ýú
# find /usr/include/ -name "*.h" | xargs -i cp {} ~/include/
2.4.3 ó.
xÎJ¼®counterÝb9Ë]°ì«+ÛëË bashbÍ/
Ýlet »A
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥ ² I / ú 23
let ’x = x + 1’
let ’x = x * 1’
¥!!9\r\ÝxãÂ`àþÐrv3quote/ô|bè
} kshôb/ÝÄ9ÎNËshellKbÝ f´1Ýportable®°
Îàexpr9ͲIú :»
if [ "$KSH" ]
then
eval ’
add()
{
result=$((${1} + ${2}))
}
sub()
{
result=$(($1 - $2))
}
mul()
{
result=$(($1 * $2))
}
div()
{
result=$(($1 / $2))
}
inc()
{
eval "$1=\$((\${$1} + ${2:-1}))"
}
dec()
{
eval "$1=\$((\${$1} - ${2:-1}))"
}
’
else
add()
{
result=‘expr $1 + $2‘
}
mul()
{
result=‘expr $1 * $2‘
}
div()
{
u`Äò·®
2.5. FILE DESCRIPTOR I/O 0' CHAPTER 2. $BOURNE SHELL
result=‘expr $1 / $2‘
}
sub()
{
result=‘expr $1 - $2‘
}
inc()
{
eval "$1=\‘expr \${$1} + ${2:-1}\‘"
}
dec()
{
eval "$1=\‘expr \${$1} - ${2:-1}\‘"
}
9î«LÝ×°P|3script
«×ø ñ§×úñ§
Î×ÍsubshellÆ1+1¬vF/ì«»¯&R&Ýbasic
P
$((1+1))
i=0
while [ $((i=$i+1)) -lt 10 ]; do echo $i; done
u`Äò·®
CHAPTER 2. $BOURNE SHELL
2.5. I/O0'
FILE DESCRIPTOR 25
×°¥ÝI/O0':
¥±0'¬v.jnéè(&ËÎ?:-))
.0'¬vappendÕjn¡
>
¥±0'standard input
>>
HOST=ftp
USER=user
u`Äò·®
2.6. ø×?f CHAPTER 2. $BOURNE SHELL
PASSWORD=password
FILENAME_PATTERN=remote_files
REMOTE_DIR=/usr/doc
LOCAL_DIR=/usr/local
# -i = non-interactive, -n = disable auto-login
ftp -i -n <<HERE
open $HOST
user $USER $PASSWORD
cd $REMOTE_DIR
lcd $LOCAL_DIR
mget $FILENAME_PATTERN
close
bye
HERE
[ condition ]
Ýautoconfprogrammerf´Kàtest àÀrconditionÝ
]°ÀrÝà°¥è} »A
jn?f
jnÎÍ×jnÎÍ©jn[
jnD3[
test -f /etc/file
êD3[
[ -e file ]
jny0[
[ -d /etc/ ]
jn\[
[ -s file ]
[ -r file ]
C?f
stringbµ/true
stringb(non-zero)/true
[ "$string" ]
string^(zero)/true
[ -n "$string" ]
s1 y s2`/true
[ -z "$string" ]
[ "$s1" = "$s2" ]
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.6. ø×?f 27
y num2
true
[ $num1 -ne $num2 ]
yynum2
true
[ $num1 -lt $num2 ]
[ $num1 -ge $num2 ]
9¥f
[ ! -f "testfile" -o ! -r "testfile" ]
î
[ test condition -o test condition ]
î
! not
î
-a and
-o or
;ðf´ðàÝêbportableݵÎî«×°à° YÌî¼1àÀrconditionf
´?:9ß
ÝautoconfÝ+°portableR ¼àtestݶ°?Ý
Qw3$?0îW ÍÂî´?
3shell scriptôb:Õbßà
if [ "x$VAR" = "xvalue" ]; then .....
C+°
if (!strcmp(string1, string2))
if (num1 == num2)
2.6.2 if f ¾ \
if test;then cmd1; elif test; cmd2; else cmd3 fi
u`Äò·®
2.6. ø×?f CHAPTER 2. $BOURNE SHELL
if test
then
cmd1
...
elif test
cmd2
...
else
cmd3
...
fi
!ø¥¶W×`Ý5rHLÍ3¶Makefile`ºàÕ ¨²Ýelse
ifÎelif «CÝelse if×ø
¨²bËÝifà°
[ "$VERBOSE" ] && echo ’everything’ && îF/true`Æ&&¡
«®
|| îF/false`Æ||¡
«®
[ "$VERBOSE" ] || echo ’nothing’
9\bF¥
AÎèCF/false 9Í@
[ "$var" ]
[ -n "$var" ]
;ðÀr
«Î9°¾\Ý]P¬Í@NgA:ÕbúðÝP
ºÆ×gú ¬ÎBÎC|3if while
«ÆP
(expression)/return X/¼ÝÎúÝstandard outX|
|½!`Æú Q¡¾\ÆWͼXì×M§®
ÄbÝúWݺ3standard out ×ÀC&Æ|¿à9øÝ
¼ ®¾\»A
[ "$(find . -name gyoza.txt)" ] && echo "I Find It !!!"
à$(cmd) yà‘cmd‘A0Õݺ9Íjn¼X|ÔSr
«” ”b
 Àr
µ/trueCA^bÔSr A©b×ÍCJº WCÕG
true
X|
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.6. ø×?f 29
$ [ 1 ]
$ echo $?
0
$ [ 0 ]
$ echo $?
0
AbËÍ|îJshell.findó¼ÝCê WúƵs
ß ý0Ý
2.6.3 for loop
for var in $list; do cmd1; cmd2; done
¥¶W×`Ý5rHLÍ3¶Makefile`ºàÕ listÎshell
ðàÝ
×Ë]°µ©Î9àè}Ttab5Ý£]µÎ »A
ME="I am a gyoza"
Í-ô;G«Ývar
for ELEMENT in $ME
do
echo $ELEMENT
done
µº¨
I
am
a
gyoza
¥þÐr'ó¸àóÝ-²
u`Äò·®
2.7. PORTABLE SHELL REMOTE SHELL
CHAPTER 2. $BOURNE SHELL
2.6.4 while loop
while test ; do cmd1; cmd2; done
while test
do
cmd1
cmd2
done
!ø¥¶W×`Ý5rHLÍ3¶Makefile`ºàÕ
2.6.5 case switch
case $var in *)cmd1; cmd2 ;; xx?)cmd3; cmd4 ;; esac
case $string in
*) cmd1; cmd2
;;
xx?)
cmd3
cmd4
;;
esac
case $answer in
[Yy])
echo ’yes’
;;
[Nn])
echo ’no’
;;
esac
¶regular expressÎý0Ý¥à×¶Ý]°
2.7 Portable Shell remote shell
remote shellÆÎËÝ.GÐÝstandard out =Õ
Ýstandard out X|
×telnetP
Í@A®(@©3bashî£ôàÊ×°¬¿¬Ý Ä
A®development`ÊÕportableݶ®TàtæÝshµ?
u`Äò·®
CHAPTER 2. $BOURNE SHELL 2.8. + 31
2.8 +
×ýãàshellÎBourne Shell¡¼;¨Korn Shell9×ÄÝ/
f´Kàkorn shell¶scripts¨²bBSDÝC shell c shellôCW×ô±
LÍ39system admin¡¼tcsh
9ýÝ©F Bourne Again
Shell.bÝ^Ý©FZZÚÚw3×R´GNU/Linux± OD×Ý
/9KbashÄ¥portableÝshell scripts¶® sh, ksh bashÎ
!×HÝ9¿Í+°f´# tcsh cshΨ×H -9×
1¼sys adminKàc shellFÙÝprogrammeràshÝ´9
u`Äò·®
2.8. + CHAPTER 2. $BOURNE SHELL
u`Äò·®
Chapter 3
Regular Express
3.1 +-REglob
regular expressÎ×Ëî]°à×°©ÝC-¼î×°é\
Ý©
L¬v
´0Ý×ËøPfE (pattern match) 3MS dos/windows
ôb8 ÝC-»A * XbCX|¯àdel *.* µ|B *Xbjn*
µ§wildcardC-Ä93shellݧ©Î§globbing ¬Îregular
expressÍ@9 QÎUnix.ÝUNIXîÝregular express?ú
vÊày9Unix 8
« grep, sed, awk, vi, emacs perl...
|1regular expressµÎ¸àUNIXÝ·~ ļ.unix.DOS£
generalÝ
CP
«§regular expressAÎPOSIXÝÙJà regcomp() regexec()
System VÝbregcmp(), regex()BSDÙbre_comp(), re_exec()
¼î0Õ){reg expressfÝCperl
«1Í@Î
m//
s///
îmatchsÎsubstitudeÄm|6¯¶µW//Ý ;ðà°
Îm//ú s///úúð:ÕÝb
m
33
3.2. C-§ CHAPTER 3. REGULAR EXPRESS
u`Äò·®
CHAPTER 3. REGULAR EXPRESS 3.3. C § - ! À r î 35
Kº/TRUE
• 0{3,} 0K¨3g -> /xxxx000xxxxxx/
C-|b9øÝ=î°
/80[23]?86/
/[A-Za-z0-9]/
î0¨ëg|î
/compan(y|ies)/ company companies
/0\{3,\}/
u`Äò·®
3.4. Pë(ADDRESS) CHAPTER 3. REGULAR EXPRESS
ÞæÍÝîÀr
.ËÍCE ¥\1 \2Ýà°
s/.*/(&)/ ( )
Í 9°ðà3ð(substitue)
s/\(str1\) \(str2\)/\2 \1/
¥Àr3G«b!LX|Ä6à\¼escape
& \1 \2 \3 ...
3.4 Pë(address)
3sed, vieditor
&Æ|¼§ÝP 9˼§Ýf
TØðrangeô§address(ë) LÍÎðúðà
range(addressing)s///
3Ï×ÕÏë *J
sed
$ sed ’1,3d’ file
.JSZaÝxxðWyy
vi
:%s/xx/yy/g
ðàÝPÐr
• , ó§× 1,5 îÏ×ÕÏ"
• 0 tî×
• . êG
• $ t¡× 5,$ îÏ"Õt¡× .,$êGÕt¡×
• % JSZaôy1,$
• x-n x?îón .,.+10 îêGÕêGè
• x+n x?ìón
u`Äò·®
Chapter 4
sed
4.1 +
Î×ËStream EDitorôµÎ;¸×£]ø«úW_ìÝ®
9Ê);Ýscripts®¼
sed
.#¡«ÝÛ*
$ sed ’/save/!d’ file
$ sed -e ’s/\(.*\)\(#.*\)/\1/’ xxx.sh
Í-eÎðàÝ×Íoption;ðÎà3ËÍ|îÝó4` Íãy( )b
©½LX|mDEaescape×ì
37
4.2. Ð)fÝADDRESSING CHAPTER 4. SED
4.2 Ð)fÝaddressing
addressÎsed
Ý©à+à¼'Ð)fÝ|-E¸Æ_ìú
Ð)fÝf¼]°b1. range(P) 2.regular express
sedÝaddresstÝGregular expression+ÛÝ 1,3 . $ %9Ëî°²
|à#à /regex/0ÕÝ
0ÕÏÞ*
0Õdelete9ÍC*J
$ sed ’2d’ file
bREC¿ÝÕjn;;*
$ sed ’/delete/d’ file
*èç
$ sed ’/RE/,$d’ file
»AÞÛWèçQ¡B*Xbèç
$ sed -e ’s/\(.*\)\(#.*\)/\1/’ -e /^$/d file xxx.sh
Tï
[address],[address]{command[args];command[args];...;command[args];}
t¡×
Z:
cyril@gyoza:~$ sed ’a\
>
Ï×
> ’ last
Z:
t¡×
Z:
Z: ¬vÆð°øÄ×::¢§` øÄ×`
cyril@gyoza:~$ sed ’$a\
º§ø§9øÝ®Þ
>
> sed
> ’ last
sed: -e expression #1, char 93: Unterminated ‘s’ command
º§ø§9øÝ®Þ
>
> sed
Ï×
> ’ last
u`Äò·®
4.4. SED COMMAND ú CHAPTER 4. SED
t¡×
Z: ¬vÆð°øÄ×::¢§` øÄ×`
sedº§ø§9øÝ®Þ
¬½»P×ð
cyril@gyoza:~$ cat address.txt
r
270
<Michele’s Address>
¬½n
<Cyril’s Address>
×ð10r
<Nick’s Address>
¬½»P×ð
cyril@gyoza:~$ sed -f inser.sed address.txt
r
270
<Michele’s Address>
100 Gyoza Blvd
San Jose, CA
¬½n
<Cyril’s Address>
×ð10r
<Nick’s Address>
b×;Ý
Ï×
cyril@gyoza:~$ cat last
ÏÞ
first line
t¡×
second line
last line
Ï׫ÏÞK*Ý
1,2c\
Ï׫ÏÞK*Ý
cyril@gyoza:~$ sed -f change.sed last
¶¶
.Ï×ÕÏèݶ¶
$ sed ’1,10y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ lower.txt
ðÝúb¥ÝÏÞ·§A3×/ÝCÙ)ðÝb
9 Í£/ºàÏ×ÍÙ)Ýð*Að*©Ýµ3¡«î
Ý Ï¿ÍIð*àg9Íflag
Ï×
cyril@gyoza:~$ cat last
ÏÞ
first line
t¡×
second line
last line
Ï×
cyril@gyoza:~$ sed ’s/first/line/1’ last
ÏÞ
line line
t¡×
second line
last line
Ï×
cyril@gyoza:~$ sed ’s/first/line/2’ last
ÏÞ
first line
t¡×
second line
last line
Ï×
cyril@gyoza:~$ cat lines
ÏÞ
first line
9
second line
t¡×
multiple line line
last line
Ï×
cyril@gyoza:~$ sed ’s/line/row/2’ lines
ÏÞ
first line
9
second line
t¡×
multiple line row
last line
Ï×
cyril@gyoza:~$ sed ’s/line/row/g’ lines
ÏÞ
first row
9
second row
t¡×
multiple row row
last row
u`Äò·®
4.4. SED COMMAND ú CHAPTER 4. SED
l«pÝ-½3E&ASCIIݧ
Ï×
cyril@gyoza:~$ cat last
ÏÞ
first line
t¡×
second line
last line
Ï×
cyril@gyoza:~$ sed ’1,2p’ last
Ï×
first line
ÏÞ
first line
ÏÞ
second line
t¡×
second line
last line
Ï×
\262\304\244@\246\346 first line$
first line
ÏÞ
\262\304\244G\246\346 second line$
t¡×
second line
last line
9\|Epattern spaceb?ÝÝÏ×
Õpattern space :Õp.Ï×
#½pattern spaceWoutputX|sedê. ×Å#½ÏÞ
u`Äò·®
CHAPTER 4. SED 4.4. SED COMMAND ú 43
Tï¶W×
cyril@gyoza:~$ sed ’/Linux/{h;s/.* Linux \(.*\) .*/\1:/;p;x;}’ command.txt
9\:Ï×Íh.Ï×.
hold spaceÄBpattern space1b æÍÏ
×ÝQ¡ð*Wls:¨3pattern space©bls: Q¡pls:t
¡.hold space«ls:øðX|t¡pattern space/ µÎæÍÝsed
WoutputXcpÎ!øÝ¼§
X|^%©ÎËÍ¿:ÕÝspace3£\ð¼ð./39Ë
Í 2]33copy/pasteµ?ÝA!viÝßT|º
4.4.3
×M
9§]º
3æÍÝh, H, g, G, x
«K©bE×§Apattern match¬
`µRDì«Ýú༧Ë|îÝpattern matchCpattern
space, hold spaceݧ
/join/ {
N
s/\n/ /g
}
.9èç*W×èç
u`Äò·®
4.4. SED COMMAND ú CHAPTER 4. SED
/^$/ {
N
/^\n$/D
}
:0Õèç¡.ì×
¼A©b×èçèç ì×
¿W×1º3pattern spaceÄ9`ìÍú /^\n$/D^®àpattern
spaceIX AbËèçX|Delete*Ï×èçyì×èç
1ºì¼ 9`.
Dú¨b®àÝX|¬Xpattern spaceÝ µ
/^$/×àºb×èçºì¼9\DPKb]ºÝ®à |J¼
®¥Ý§
flow control branch
9Î༻ÉúÆÝµ Îc
Ýif else, while9°×ú 9¤g:×R
àã:'×ÍlabelQ¡àb label®Õ9Í2]Æ
• : label, 'label
• b label branch ðÕlabel2]ÆA^blabelµ;;Æ à#®
ÕscriptO
• t label A×ÍðWtest ?fWñ¡®Õlabel X|Ä6
s///ú×Ràsú×3túG
91A:»
$ cat join.txt
join
3 +DEaCÝ; \
second line
9׫î×Î=3×sÝ
C
$ sed ’{
:a
N
s/\\\n//
t a}’ join.txt
join
3 +DEaCÝ; 9׫î×Î=3×sÝ
second line
C
9j§
• r \jn ÞjnappendÕêGpattern space
• w ¶jn Þpattern spaceݶÕ×Íjn
u`Äò·®
CHAPTER 4. SED ú
4.4. SED COMMAND 45
$ cat insert.sed
/<Cyril’s Address>/i\
100 Gyoza Blvd\
San Jose, CA
Ï×
$ cat lines
ÏÞ
first line
9
second line
t¡×
multiple line line
last line
Ï×
$ sed ’/first/r insert.sed’ lines
first line
/<Cyril’s Address>/i\
100 Gyoza Blvd\
ÏÞ
San Jose, CA
9
second line
t¡×
multiple line line
last lin
Ï×
$ sed ’/first/w firstline.txt’ lines
ÏÞ
first line
9
second line
t¡×
multiple line line
last line
Ï×
$ cat firstline.txt
first line
Í
• = r
• q Òsed
Ï×
$ cat lines
ÏÞ
first line
9
second line
t¡×
multiple line line
last line
Ï×
1
ÏÞ
first line
second line
u`Äò·®
4.4. SED COMMAND ú CHAPTER 4. SED
b9Ý»:http://www.student.northpark.edu/pemente/sed/sedfaq.html
u`Äò·®
Chapter 5
awk
5.1 +
ÝÌFÎawkfsed?àÝ2]8Eysed××ݧawkèºÝ ×
/Iûtݧb?powerfulÝ CP+°]º×§ ;P
field
|Î
awk ’script’ var=value files
awk -f scriptfile var=value files
ÍvarÎÝawkóvalueÎÝÂ9|༫shellóÚ;
¨² sedÝregular expressKJ×¼®/ÝíáfE9ø^
b ÄPawk.&àawkÝ×Íó¼®regular expressÝíáfE.h û
ô |DêÝJ¼fExÎàfEÕÐ ¼«×Íregular expressfE
var ~ /re/
var !~ /re/
condition, BEGIN«END×Íscript;ðÎ9ø
BEGIN {xxx} /re/{xxx} END{xxx}
×¶P×binit;װµ ßbßO`^âC×ø
P@ôb§¡Ýroutine¼§awk®
×ÍPlVÝscript+
èºÝ×ÍgeneralÝ@ݧ
ÕÕb¿Íèç
$ awk ’BEGIN{x=0} /^$/{x++} END{print x}’ scripts.tex
×'x=0¡BEGIN¡Ýµ3ÆQ¡N\×
¼AÎèç
µ x++t¡\Õjx
B3î«Ý»
awkÝó«cÎ×øÝôµÎ^bþÐrÝ9
\«shell perlscriptf´×ø
5.3 ó û §
«¥ÝËÍL
awk
• record µÎ××Ý£]
• field ;ðãspaceTïtab"âÝ£]ûµÎfield
$ cat datafile
99 98 3.5
300 298 4.9
498 493 5.9
699 698 7.6
900 748 9.0
1200 703 9.6
1500 651 10.4
1698 627 10.8
9øÎinputËÍûíoutputËÍû
àprintíûã<r , 5
$ awk ’{print $1,$2}’ datafile
99 98
300 298
498 493
699 698
900 748
1200 703
1500 651
1698 627
9øÎinputËÍûíoutput×Íû
$ awk ’{print $1 "," $2}’ datafile
99,98
300,298
498,493
699,698
900,748
1200,703
1500,651
1698,627
5.3.1 /ó
tÝ C+°Ýóx,y,z....awkb×°/Ýó( ûîÝ/
ó
ARGC : number of arguments on command line
ARGV : array containing the command line arguments
Jrecord
ARGIND :
ÏnÍû(field)
$0 :
$1....$n :
×Íassociate arrayâbIÝ(ó
t¡systemýÝerror number:/usr/include/errno.h
ENVIRON :
ERRNO :
/ÎèçT
/Îèç
FS : field separator tab
/Î
OFS : output field seperator
/Î
RS : record separator newline
ORS : output record seperator newline
NF : number of field
NR : number of record
u`Äò·®
CHAPTER 5. AWK 5.3. ó û § 51
|J¼®conditionà
ô|J¼®conditionà¤góregular express matchÕ
NF NR
Ð~
$1 $2....
$ cat datafile
# This is the data file from experiment
99 98 3.5
300 298 4.9
498 493 5.9
# Failed data
122 123
699 698 7.6
900 748 9.0
1200 703 9.6
1500 651 10.4
1698 627 10.8
u`Äò·®
5.3. óû§ CHAPTER 5. AWK
delete afield[2]
u`Äò·®
CHAPTER 5. AWK 5.4. ÃÍ×+° 53
6,/export/lcyril
7,/usr/bin/bash
0,
1,lcyril
2,
3,100
4,1
5,
6,/export/lcyril
7,/usr/bin/bash
5.4 ÃÍ×+°
tÝûÝó©à°²awkfsedúÝ3y?#P+Ý×]
° awkÝ+° c1@3awkËÝbcÝÃ|µºÝ Q
ô|. awk.c
5.4.1 ó.ìÕÐ
C Ý×ó.
+ - * / % ++ -- ^ **( 9Îfortranݼó)
C Ý×¼
= += -= *= /= %= ^= **=
C Ý×ì
Ý AcondWñ/result1Q/result2)
! == < > <= >= != && ||
?: (c cond ? result1 : result2
ÝìÕÐ
«bÍf´©½ÝµÎpattern matchÕÐ ~, !~ Þ
¼ bàÝv«ÕÐ~=xÎregular express;ðmatchÝÎ ×®
condition
/ÝfEAEØÍ©óre match`µàÕ9ÍÕ Ð
perl
AxÎÍZ°óC
if (x ~ /^[0-9]+/) {
x += y
}
u`Äò·®
5.4. ÃÍ×+° CHAPTER 5. AWK
5.4.2 if
^%ÝRµÎc
if (condition) {
} else if (condition) {
} else {
}
¥else if«c+°×ø
5.4.3 for loop
9\ÝforbËÍÎcbourne shellÝá)perlôÎ×øÄperlàÝ c
shellÝ+°
:»
$ cat gyoza.awk
#! /bin/awk heehee
BEGIN {
x[1]="I"
x[2]="am"
x[3]="a"
x[4]="gyoza"
y["I"]="I"
y["am"]="am"
y["a"]="a"
y["gyoza"]="gyoza"
for (i = 1; i < 5; i++) {
print x[i]
}
for item in x {
print item, x[item]
}
for item in y {
print item, y[item]
}
}
u`Äò·®
CHAPTER 5. AWK 5.5. FUNCTION 55
5.4.4 while
^%ÝRµÎc
while (condition) {
statment
}
do {
statment
} while (condition)
# ;P
function fun(arg1, arg2) {
arg1 = arg2
xxxx
}
4Ý»
$ cat sort.awk
u`Äò·®
5.6. ÍÐó CHAPTER 5. AWK
# sorting function
function sort(Array, elements, temp, i,j)
for (i = 2; i<= elements; ++i) {
for(j = i; array[j - 1] > array[j]; --j) {
temp = array[j]
array[j] = array[j - 1]
array[j - 1] = temp
}
}
return
××¼
}
# main routine,
{
for (i = 2; i <= NF; ++i) {
grades[i - 1] = $i
}
sort(grades, NF-1)
printf("%s: ", $1)
for (j = 1; j <= NF - 1; ++j) {
printf("%d ", grades[j])
}
printf("\n")
}
$ cat grade.txt
YY
100 60 75 23
100 98 99 89
$ awk -f sort.awk grade.txt
YY
: 23 60 75 100
: 89 98 99 100
5.6 ÍÐó
5.6.1 C§-matchð
Cî§ sedbs///9Ëðÿàî×°/Ðó
• F/Ð)regexÝ3stringÝH
match(string, regex)
• F/C: F/3ÏmÍC-?¡ónÍC-ÝCn^µÕ9
substr(string, m, [,n])
ð: ðÝ¿ÍÐóbÝF/©½
u`Äò·®
CHAPTER 5. AWK 5.6. ÍÐó 57
9Í»àÝlength()9ÍÐóregexàSrbstringÝ2]à double
quoteÀR¼àgensubº;string2Ý v:ÏëÍprint $09\
ÎbgreedyÝ[T3X|©yì¡«×^
5.6.2 íáí§print(f )
íî¼1printÎÝà°Äb??Ýformatíµ c
Ýprintf
Tïfortran×ø
printf()
à°«cÐó×ø
{printf("The sum on line %s is %d.\n", NR, $1+$2)}
u`Äò·®
5.6. ÍÐó CHAPTER 5. AWK
î×ÍC
î×ÍJó
%s
î×ÍnÍJómÍóÝFó
%d
%n.mf
5.6.3 Bórand()
®ß+y0 Õ 1 ÝBó
BEGIN {
srand(systime())
random_num = rand()
print random_num
}
5.6.4 Ùsystem()
9Í UnixÝsystem()9ÍÐó
BEGIN {if (system("ls -l")) != 0) {
print "command failed"
}
}
ÍÝ ó.Ðóµ|+ÛÝ
u`Äò·®
Chapter 6
perl
perl«ÍÑshell, TCL/expect...script+Í@ÎàC¶¼Ý N
×ËscriptÍ@KÎ×ÍÆP©Ä9ÍÆPUÿ×°/+°
ºÕ9°!JQ¡»ð9°scriptó×]ºW
Ýcó«
]º Q¦!Í@t¡ÎKÎassemblyÝó«]º¼Æµ«shell,
awk× ø
6.1 ÃÍ+°£]lV
6.1.1 ó
Ñ'ãÂKÍþÐr
59
6.2. ?POWERÝREGULAR EXPRESSION CHAPTER 6. PERL
6.1.2 f×
6.2 ?powerÝregular expression
6.3 ðàÐó
6.4 Ù§
6.4.1 process
6.4.2 jn
6.4.3 system call
6.5 module
u`Äò·®
Chapter 7
perl
$var =
C
int var =
char var =
Makefile
var =
var :=
¸àó
shell
$var
${var}
awk
var
61
7.2. pHASH +°f´
CHAPTER 7. BOURNE SHELL, PERL C
perl
$var
C
var
Makefile
${var} or $(var)
¥ÝÎ
• shellÝL$ ¬á¼óÂ`×$ perlµf´×l ÑA¢
µÎ$Ðr CµÎK
• shellÝrG¡bèç
var= var = Î×øÝ perlCµ^b§×MakefileÎL¸à
«shell ×ø¬ÎrG¡|bèçX|b°Ë4B×ì
7.2 pHash
shell
array="e1 e2 e3"
perl
@array = {e1, e2 ,e2};
%hash = {key1 => val1,
key2 => val2,
key3 => val3};
C
int array[] = {1, 2, 3};
shell Ýl£]§list
«-ôàspace5tðàÝ)
for var in $array
do
cmd1
done
array Ý-ôµÎàspace5Ý£] perlbÍ Ýforeach
foreach $var (@array) {
xxx
}
Í@9ÎC shellݶ° C^b 9ø×Í×Í;arrayÝ-ôóÝ^
×
u`Äò·®
+°f´
CHAPTER 7. BOURNE SHELL, PERL C 7.3. fB 63
7.3 fB
shell
if test; then
dosomething
elif test; then
doother
else
allright
fi
perl
if (c) {
do_something;
} elsif () {
do_other;
} else {
allright;
}
C
if (c) {
do_something;
} else if () {
do_other;
} else {
allright;
}
9\¥ÝÎshellmÀrelse ifݶ°ëÍ×øfP¶°
shell^b×à()fP©testÎØÍÆÝBµ?
7.3.1 ff´
shell
C
óÂ
[ "str1" = "str2" ]
if ($num1 == $num2)
u`Äò·®
7.4. ]º× +°f´
CHAPTER 7. BOURNE SHELL, PERL C
C
C
óÂ
if (strcmp(str1, str2))
if (num1 == num2)
¥óÂf´Cf´C§ìf´ ã9\&Æ|:Í
@perlÎ&ðbÄPúÝ
7.4 ]º ×
7.4.1 while ]º
shell
while test
do
cmd
done
perl «cÎ×øÝtÝóà°×ø
while (condition) {
statment1;
}
unless (condition) {
statment1;
}
C
while (condition) {
statment1;
}
do {
statment1;
} while (condition)
u`Äò·®
CHAPTER 7. BOURNE SHELL, PERL C +°f´ 7.5. P 65
perl bËËforÝà°
for ($i = 0; $i < 10; $i++) {
statement
}
foreach $var (@array) {
statement;
}
C Ýà°
for (i = 0, init = 1; i < 10; i++) {
statement;
}
7.5 P
shell
func1()
{
arg1=$1
arg2=$2
}
awk
perl
u`Äò·®
7.6. Û +°f´
CHAPTER 7. BOURNE SHELL, PERL C
7.6 Û
shell
# comment
perl
# comment
C
/* comment */
u`Äò·®
Bibliography
[1] Linux In a Nutshell, Ellen Siever, O’Reilly & Associates, ISBN 0596000251
[2] Sek & Awk, Dale Dougherty, et al, O’Reilly & Associates, ISBN 1565922255
[3] Perl Cookbook, Tom Christiansen, Nathan Torkington O’Reilly & Asso-
ciate, ISBN 1565922433
[4] The C Programming Language, Brian W. Kernighan, Dennis M. Ritchie,
Prentice Hall, ISBN 0131103628
67