像我儿子一样永远保持好奇和梦想

【读书笔记0103】Beginning linux programming-shell programming

上一篇 / 下一篇  2012-03-05 11:14:30 / 天气: 阴雨 / 心情: 平静 / 个人分类:linux

学习体会:本章内容比较多,我这里按照自己的理解重新组织了一下,希望对读过这本书的同学有帮助:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台)It%MQ^~\

shell programming 是linux学习的必经之路,也是必须学好的,经过一段个人体会是:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 s R1z:u#m
shell 编程主要是考察你对shell 的一些结构组织,标识,命令的理解,这些都是日后读scrips所必需掌握的东西。
/\ h-s6Cf0也许实践才是学习shell的最好方式,所以这一章虽然读完,感觉很多东西只是理解并没有达到能应用自如,这一定需要比较长时间的实践。
)L qb~U e4~Ov0这章节,作者依旧娓娓的将shell里面的各种复杂的知识做了归纳,由浅入深,非常适合基础差的同学。
+G,r+wi)^nQ0感觉,有经验的如果能仔细看一下这个章节,也对自己的是个系统整理的过程。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台4z0u0p|r.}

What this chapter tell us:
X3d8@zNF0- what the shell is ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8R$Fnb6?6G

qqP cXP/`6@0- basic consideration
Nn3v1`5KKs~T0
nyr#N}$rm"ig"r}0-subtleties of syntax: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.d7gx{2We5c
 variables,conditions,program control
PF(AQ'c0 lists
P k.IhT0 functions
h(_Q3`1?4f"F0 commands and commands execution
w N*V7\P9wa0 here document 
%kwzi)y$Hj0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$E.~$a JHj_ay
- debugging ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台l(Xrn;D

X)j'e1[#s] E0- grep and regular expression
j&t7J#xM_)o g+Au0- findET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台`2N`ru%DB

- what the shell is
#DO)d`'tX0Beginning of this chapter:+
/d&x,D} NH01 why we should use the shell?ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2Vrx-H?J-@3@)n
- shell could easy to run at the very complex program which are not time-critical。
8`9l S$W i(I0- shell use the interpreted ( 解释性) language so not only your can execure the commands and utilitie on the shell but also you can write them.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台t^5O7u1]&PH|
[hsy75] what is command and utilities?
gjyHI3t$K0e.g.
Wa|0lB0$ls -al | more
,z5C8~*bP'Np0this command use the ls and more utilites.
[/Y,W/fX;naOX0
$rY#JAaTW0
!XQ8u3V;a-p:p:i02 what is shellET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 fD\2FNNe&jBeu
is a program that acts as the interface between you and the linux system which support the commands.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 w;A7p4Qd

- basic considerationET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台X$H[K)EY g Y
Pipes and redirection ( 也就是用于控制shell的输入输出)ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台U]-Iy}S-U"i
Redirection:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 l`FOn!xO'g._
[hsy75]个人理解,在default之外的输入输出定义都叫做redirection(< > >> ):
!SD#p5[Kj0default:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 @Y-H ]%kOI._
-0 input
4K,L5Xp:cmAE0-1 outputET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"K1c_#U%otR5tK
-2 errorET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台~]3W#~C M4g@(@

O"O&z4W rk`B0l0>> used to append to the file:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台O&b*a o[h:I i
e.g.
}.^9A*f3j7d:KOrJh0$ps >> out.txt
)w*ZJ6['o#y/H-f4bo0
c)p$A)[V[H)b3k0>& used to combine two outputs ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台e/C"ZI.j|5C
[hsy75]2>&1 often used to get the error code to a file
gJ-w4l{t? y9j0e.g.
.Nmk Mg0M4B C0$kill -l 1234 >outerr.txt 2>&1
5Y$K|SdgOf+}0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_B5HC Zp&C,\ m
Pipes ( | )
d!z,V C&wq#UtrG0[hsy75] Pipes 就是自动同事处理多个流程到一个你想要的结果
SSN(q#z$j0process connected by pipes can run simultaneously and auto rescheduled as data flow between them.
9^X"ZzDIv0[frankhuang@localhost bin]$ ps |sort|moreET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 BM/X0Xq1W(Q
11220 pts/1    00:00:00 ps
11221 pts/1    00:00:00 sort
11222 pts/1    00:00:00 more
 6800 pts/1    00:00:00 bash
  PID TTY          TIME CMz
8OGU(@"?S0

 Shell programming = script. creating
 1 wildcard
通配符 expansionET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Ai2A!yRM
shell programming 你必须了解通配符:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台yH!dm9mT)q)r
*ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台E*x&H3~W:[)dfA
?ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5s1L&a$|(A7|!z
setET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5V:TE0~*OZ%z A
^setET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台M#q*T,C u/?"u'u
{}
-z%| T4b6z0and so on:
T|3RRE:c'U2vHdXk0
,x o)Ct&yk02 to make a script. executableET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(z @jC?"w(s?
[frank@localhost ch02]$ chmod +x first
Qvs8Sg?:l0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8VOG#H3S#wu;E

I)z;` `Yz ae,TL l0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台gZdE&]H

-subtleties of syntax: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'U Ma%p)~&\k*ax
变量
variables
P+@4a[bC4S7jE0[hsy75] 一般shell 变量就是指: a variable by preceding its name with a $ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+mPr/iD ]!Dp9O
常用的检验变量的方法就是用 echo 把他打印出来
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 J [Q| |

变量定义时候要注意下面几种quote 的不同ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台U'L @6h3D H P
" " 括号内均为变量 [hsy75] 好的习惯是用这个东西把变量wrap起来,从而避免shell出错 e.g $"test"
'  ' 这表示里面的是字符串 这个也很有用 当你想输出默认字符时候
%Xp+\,b0m?+N"f0   eg.  ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台G9ln,U:A_U1D
    y='$'$x   // x=100ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8G jYv/X&e%r&o
   echo y
!Wd0mU9b-?}Lk e0   $100
Ly$km `(F B1?$|0   这里extra 符号$被打印
\ 反斜杠又叫去功能化标识,用来是上述quote 或者$失效
Wmk2F+q8E3{!Mx'C0
%H D#XGj,y0位置参数变量符
h}"O)B:}3q0IFS 用来定义字段分隔符ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.} S)F4jI2mo
$1ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台3OZ-EsEA
$2  【hsy75] 这里 1,2.。。positional parameters 是shell里面经常用到的
@6N`~L0
+S'N}#B:uw!K0$* 去除ifs定义的分割符ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台r'c!l:HUq-O ^$i
$@  不
去除ifs定义的分割符
U0LId+K;O{0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0tZ$Sj:Bpx-pO
conditions
program controlET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台^0TRf |t)V
(if for while until case )
,n'NK;_h z\'|t0J.Q0[hsy75] 这里和c很像,可以忽略
Pdj)I\:f~0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台ay&eNP:[0x
注意一下:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$F&L[#X8C$\L
[ = test
o Hd~O:l/]CZ0
test include 1string comparision /2arithmetic comparison /3file conditionals.
q+i`~.u0
-d;j)^"t5Q(RR#B0
F*l ?} rM8h0list( AND OR )ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台X6WM+RfQ4~bj1y.F
e.gET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'h+}h$Fn%S;s
记住这句就ok了ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;z2Z!h5p2CE!c
[ -f file1 ] && command for ture || command for false

hr` w[\;V i$Y0
viT)D4h0
functions
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6ws K JD%oi
shell的函数最重要的就是理解位置参数了(positional parameters),用户端的输入或者是函数参数的传递都是通过这个

eg.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台~4eR+i'O4y t,V*yF
用户通过shell输入:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,Vk Iw6[KB:g-co
Frank Huang
t%s+N|a0那位位置变量默认就是:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台s rnS$Y5j&AL5}-b*?
$* = Frank HuangET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台wSqU*wX6G^"^
$1 = Frank
9Ljk0SOQ0$2 = Huang

Yn/x!a`FKc'P9x.s0
8] I$p0iJ5{)r^0
和位置变量非常有关系的是命令set ,set 经常被用来根据变量来转换为位置变量:
R|YL+X;p&ex6[ t"H0经过set 命令后 data 的值就给了位置变量可以被shell利用了ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台M'q~$|,o
e.gET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#\ ?+ppQI
set $(date)
echo the month is $2
\'qRgH7_ B0


vR$Rf)x:A,d0
 commands
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.Q1b2VdCt @
:                    = testET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台K+YrG!K W5S5R/_
.                    = current shellET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'Y&Nv g1k&bL&Ag
echo            这里再一次提到 \的escapte的作用
-g}2GK#wgY0eval             = $( ... )  [hsy75] extra the content in brace , means give you the value of the value of a vaiable ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台S+VTKD`
exec            replace the shell
b |2M8HK0exit  nET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#k7M/G RFv,CF
export         just creat an enviroment variable which can be seen by other scripts
xY-M h[9d'{g4Z0expr  (expression evaluate)          = $(( ... ))   [hsy75]注意这个和前面的 $(...)取变量内容不同 是double parenthsis ,
'O Cl1Zt(]`0printf ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9^0LD} kP+?;I
return
K:o1djI{5\0set             很有用的是将一组变量的field 和位置变量联系起来ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台-I r1EP nC3V@
                  set the para variables for the shellET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:g P WoAg
                  egET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2N9[ Y'Q4T(R1oD

(Z,H?:p'u+kVr-V0                  echo the data is $(date)
                  set $(date)
                  echo the month is $2ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台)@ i/X.U9l @
                 
\)}0}RQ `*t'C;J K&[0shift
{k&nvY ue0F7n8VT0trap
mj]:jf/nBBL0unsetET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;|Q"skb1Jf/k e%y
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台3my(Ki `"_6Ui
two useful commands
*fE#qf7q;p2iW0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台nxxm+`4@;f,])|`
find (search the file or directory) [hsy75]diff from grep which find for stringsET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 ^F#u-^"@%Y w r.F,Q2a
syntax
:g!hI Wf(se:|n \@0find [path] [options] [tests] [actions]
v*z,t+Wo$V0eg.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*xSK1i c5mH
$find . -mount \(-newer filename -o -name "_*" \) -type f -exec ls -l {}\; -print ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$Bo0W0s'evAI
[hsy75]上面这个find 看起来很难,我归纳一下书上的解释下面一下就其实简单ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(b:w {F%[]
$find .[path=curernt directory] -mount [options=do not search the other files system]\[quote the braces using a backslash to escapte the meanings in shell]([combine the tester using the parentheses]-newer[tests = newer ] filename[tests newer's pattern means the filename is older than the finding file] -o[tests operations means OR] -name[tests= name] "_*"[tests'name pattern means name started with an underscore ] \)[escapte the parentheses] -type[tests type] f[tests type =file] -exec[actions exec] ls -l[the command that we use invode by action] {}[used for -exec or -ok means the full path to the current file]\;[means the parameters on the line of action is end so it is a termiator ] -print [another actions that to print the result]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1L&r7}Dh n
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d4~B _;l
grep  find 的兄弟,经常一起用 find for string :said by writer it is quite common to have grep as a command passed after a action -exec when using find ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.C&i*G d+\e$ZC
grep [options] Pattern [FILES]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台s#fS,@,s,{Ac+z ]o
[hsy75] 看起来grep 是非常简单的,但是,当你开始接触 regular expression 的时候,sophisticated would occurs ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.F`` {/@p

wC*m2U%z&X B1DK0regular expressiomET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台O.R\V6})Zl,i,_g
     anchor to the beginning of a line
$     anchor to the end of a line
.      any single character
[ ]    range of characters

a+JWu:v[6A0
[:blank:] special match patterns,the blank 可以被其他参数代替
2p!I s/\L0
D d@O7J+b3@_0-E  extended matching
JG%^Wo;Cs8@[Y0[hsy75] 下面这些是给-E扩展用,所以必须都用\来escapte shell 的功能ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1lL6\:Tk5w x
?
Tv^3kz6sI*x0*ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%xbGm;w1m3L([
+
oa S8?*bt0p6K0{n}ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:reu ]2G
{n,}
[{:ujl;y Pa8a2Q0{n,m}
g}3It6soc`+gr0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d"j~ P6g%| |"H&f
e.gET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台n _s/y2UG!I
[frank@localhost ch02]$ grep Th.[[:space:]] words2.txt
The handle toward my hand? Come, let me clutch thee.
The curtain'd sleep; witchcraft celebrates
Thy very stones prate of my whereabout,ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"i1kY \pA5}$]
[frank@localhost ch02]$ grep Th[匹配Th].[匹配附加任何一个字母][[:space:]][后面紧跟 空格] words2.txt[被查找的文件名] ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台\6B o~+w:C?

(d?yD c*e k0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'W+Aen/V$n0N._

I/x FG0Mk nn0[frankhuang@localhost ch02]$ grep -E [a-z]\{9\} words2.txt
Proceeding from the heat-oppressed brain?
And such an instrument I was to use.
Thus to mine eyes. Now o'er the one halfworld
The curtain'd sleep; witchcraft celebrates
Pale Hecate's offerings, and wither'd murder,
With Tarquin's ravishing strides, towards his design
Thy very stones prate of my whereabout,
y#hR hv2['s3h?0[frankhuang@localhost ch02]$ grep -E[扩展支持开启] [a-z][range of characters] \[Escape for shell of {] {9[有9个字符匹配也就是单词长度为9] \} words2.txt
"f)EX8wm$Jn ThU0
;@h*tV f2d(}b0
and commands executionET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台H-z:UsO
1 $(command) = '\command'\
XpTrJl wx7s0we often need to capture the result of a command exexution for use in the shell cript ,the above syntax helps put the output of command into a variable .
UFZP"|0the ability to put the result of a command into a script. variable is very powerful.
-XF})N&qR$V0e.g
#kf3Yh#N!RW0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台BY(UD'B2`/{
set $(who)
writer = $(who)
echo $writerET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+nU6L$U9u
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%XU Eu h?Cj
2 $((arithmetic expansion))  = $(expr arithmetic expansion) 注意这里是双括号
Wiin,QB y7N0
a` T8J7P/My0Parameter expansion
XX4d"IZ%g1q2w03 ${variable}  变量拓展和保护
F'g4`.T S'e r ?03.1用来保护shell的扩展时候,只扩展对应的变量ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Mv!D,j$rAK;m7C
e.g.
J6t ~MEZjR!`0y0
for i in 1 2
do
    creat_file $test_{i}
    creat_file $test_i   报错

done
2el|:M.j:}0
3e,DTK2k;Lr"o*}03.2 参数扩展
6RKWV6Qz~0f'M7_!M0${param:default} 
)UMW9q5[0类似的还有下面变量扩展参数
W%Rw$xG!ky0#       从头删除匹配字符,如果多个匹配,删除最小匹配长度,并返回ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/kKj;CMw
##    从头删除匹配字符,如果多个匹配,删除最长匹配长度,并返回ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_/y+i#eS5y'Q N
%    从尾巴删除匹配字符,如果多个匹配,删除最小匹配长度,并返回ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台O `e3e8@K'[e zd
%% 从尾巴删除匹配字符,如果多个匹配,删除最长匹配长度,并返回ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Lkd8})OTl
参数扩展,在redirection output的时候非常有用,ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台t&RJ.Z `&A
since linux are havily round the idea of filters, the result of one operation must oftern be redirected manually.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#Bs#c'y]3Bw
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台-d)r0Mc b7p^'R k&h
e.g.ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 __)o3V6Y~S7w
for image in *.gif
do ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台@b,V6a.J
cjpeg $image > ${image%%gif}jpgET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台[#| TiS2u"`%R}
【hsy75】解释扩展如下
cjpeg[a program to convert from gif to jpg] $image[get the file name from the *.gif] >[redirection] ${[圈定需要替换的变量] image%%[从尾巴删除匹配字符gif]gif } jpg
doneET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 td9NAd6e\Z

:RN2~9PO9~ \Z'|}9H/a0比如 draw_0001.gif  将变成 draw_0001.jpgET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台HJe`2pXB!q
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台S g!w q`.{ _
eg.
x$K2s2T,vY-N0#!/bin/sh

unset foo
echo ${foo:-bar}

foo=fud
echo ${foo:-bar}

foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}

bar=/usr/local/etc/local/networks
echo ${bar%local*}
echo ${bar%%local*}

exit 0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 r|,xVk!]I!pk a
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台nSG K K$nwK
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台l"I-M \p(bO o/@L]
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc/
/usr/ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台+l7F&IK Y)?

 here document ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台A&@#yK7_H
其实就是像自动命令的输入,可以和编辑器绑定起来,从而实现通过文件读写来直接运行编辑器里面的scripts
/\}?6m"`IH"`0e.gET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 G5Nf}1M I2x
#!/bin/sh
Y9Y'V GYY2V%u)h*xU0
0w'o3T(xu5ij1s0ed[编译器ed] textfile <<!FunkyStuff![here document的makers]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8`4?:v:Ua+^4MVRd
3 [ed 编译器命令 move to line 3]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台\ w vd B3y2oN
d [ed 编译器命令 删除一行]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 I_a4g d j
.,\[这里避免shell的作用,从而shell执行的时候可以将$后面的东西看成是非变量,从而保证ed的command 正确执行]$s/is/was/ [替换 is 为was]
h`0Kv[,Q$U'o0w
c}x pV)bm0q
O2Zj]:j#~4\0!FunkyStuff!ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台pP_{(Z0B8}Ph{

A6W$Z)]?RJJ0exit 0
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2q~M e4X n}
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6nC"S+b,R5_
This is line 1ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%tz;V,h#k qp
This is line 2ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台r Ab1dt
This is line 3  被删除
1Vu aO8p%S0This is line 4  被替换
lQpu"`0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台NwX1~l`%s C*c5}9A
将变成
_9c4`:Q:J] t:S#X0This is line 1
7`3~J!Z9[Y0This is line 2
9H t*tG4y Q`0This was line 4
\Cy DMg'@.{0
.z5g-F@5tr Z0
debugging
8zm Qd5O b(^J0-n check syntax error only
&rL%Lu,d%o+u0-v Echoes commands before running
l+j~yL~^q6`K b&A6t0-x after runningET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台bS^4?2X

)Y;d*du#x!h[-Ku0set -o xtrace ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/YHw*W6Z9@2l
set +o xtrace
.W+W$[ }-m0
hnV Nl5v[0其他的调试选项ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台@y$^'t Wy7k
-u
-{4Y O!LQ i0-o nounset
#V M0\:g]0-o verbose
fM/{n&O o,e"W'x0
VV.Mc'wr?` u0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台vP%x-w[kz
我们用上面提到的例子再来说明一下如何调试:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 yap*pL:ID(b:e9~
1 没有调试:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2}3W {ZOA#`9AhF9wO[
[frankhuang@localhost ch02]$ ./param
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc/
/usr/ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*Y3r^QZP)c1[+y

Z"d2d+c]K02 打开set trace调试ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台4]#b^u&y/i^&~
[frankhuang@localhost ch02]$ set -o xtraceET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_M1H[p\,w'\,e
++ echo -ne '\033]0;frankhuang@localhost:~/beginning_linux/beginning/ch02'
[frankhuang@localhost ch02]$ ./param
+ ./param
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc/
/usr/
++ echo -ne '\033]0;frankhuang@localhost:~/beginning_linux/beginning/ch02'
}k"p(@,cM0
b7VM`5Ikpj Cfw1K03关闭set trace 调试ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台O#P(?L^0eCjo
[frankhuang@localhost ch02]$ set +o xtrace
vg~S+GR'V.Jz0+ set +o xtrace
[frankhuang@localhost ch02]$ ./param
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc/
/usr/ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#|#x#E x.OX[:S

)D#t0b?wR-O)F04 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台f&x.RU LL8Q#X
[frankhuang@localhost ch02]$ sh -x ./param
+ unset foo
+ echo bar
bar
+ foo=fud
+ echo fud
fud
+ foo=/usr/bin/X11/startx
+ echo usr/bin/X11/startx
usr/bin/X11/startx
+ echo startx
startx
+ bar=/usr/local/etc/local/networks
+ echo /usr/local/etc/
/usr/local/etc/
+ echo /usr/
/usr/
+ exit 0
qd3l_s0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台yFk&VE%Pf F
5ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 @ y0g+g&C!{R)R9F
[frankhuang@localhost ch02]$ sh -v ./param
#!/bin/sh

unset foo
echo ${foo:-bar}
bar

foo=fud
echo ${foo:-bar}
fud

foo=/usr/bin/X11/startx
echo ${foo#*/}
usr/bin/X11/startx
echo ${foo##*/}
startx

bar=/usr/local/etc/local/networks
echo ${bar%local*}
/usr/local/etc/
echo ${bar%%local*}
/usr/

exit 0
1U4G)^L*uo0
going graphical - dialog utility
#LKT(q^0图形输入工具,这个再编写大型的shell配置文件时候经常用到
}lR x5BUL0e.gET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/c B)U2^1~N M5p0`

%r!{8eeU5q0
the doc in under development
;k*i J6KLg0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5Jz*}9S!n*|{9J

TAG: linux Linux LINUX 读书笔记

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar