|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 X' {. f m( @2 D" z特殊字符( n% ], ?# Z& e! k( r4 ] M
* Q1 S9 q% R0 i8 r8 w; y/ E
# 注释4 T7 Q8 v( V: H& A5 W" F% g9 C
表示注释 #注释
9 k8 m% P' N; b" P! c+ a4 }0 t* l在引号中间和\#等表示#本身' q! X2 z# H; Z+ O4 R- k
echo ${PATH#*:} # 参数替换,不是一个注释/ |$ a. _+ J7 v2 Z2 l& h
echo $(( 2#101011 )) # 数制转换,不是一个注释
% E( d; E- I* W( Z* I
4 D" R, F' X5 K3 m( @5 \* r; 分隔
# X" V2 K6 D' E/ n+ Y: ~: K) X命令分隔,在一行中写多个命令 echo "aa" ; echo "bb"( W M: h3 e3 h: _% d( |1 }
在条件中的if和then如果放在同一行,也用;分隔; ^$ `0 H6 v& b8 W1 Y, X
;; case条件的结束; j8 e* t: s4 H' v$ c4 @! I' y
9 r @4 Y6 ^, b& T. B( w! e. 命令相当于source命令
# |1 w. k. n1 \( o2 H命令:source
0 G% [. q R. f4 b( c8 f! F9 q' ] W文件名的前缀,隐藏文件
5 _: R q$ {' R6 L5 z+ L, d目录:.当前目录,..父目录
7 X! Z; i0 k$ Z# _7 G7 q9 l$ S正则表达式:匹配任意单个字符9 d6 D& |9 C; g, t
"" 部分引用 支持通配符扩展! D* `' e/ k) C) l
% e; e$ c$ K; l& p2 Y, Y8 |( A' ‘ 全引用,不进行通配符扩展, g. Q6 W, p" v
9 H5 \8 O) x# f
\ 转义, Q8 A8 f% @- S" i6 C- g7 a
6 [5 T0 \. e( \2 J" n4 Y% }
/ 目录分隔符% u" l/ k4 u0 B( ~/ x
. t, h; d" v+ i. L. @
, 多个命令都被执行,但返回最后一个
& T: |) K. K+ r, H$ b
* J& A: D, [8 J" `` 后置引用
7 ^9 o0 \1 I& ~1 t
1 l8 W/ c/ \7 g. X( z8 Z- |) [4 H' I( a1 Q: 操作符' g; x* \. `% N) q) }" t
空操作
% C2 c6 ?- ~6 @* t$ G) C死循环: while :
) e) W b" y. n在if/then中表示什么都不做,引出分支
& m) F; |1 E2 d- H7 x9 l, R设置默认参数: : ${username=`whoami`}
5 p3 s* W3 W |; ?6 g变量替换: : ${HOSTNAME?} ${USER?} ${MAIL?}
. ] S% o3 i- j在和 > (重定向操作符)结合使用时,把一个文件截断到0 长度,没有修改它的权限;如果文件在之前并不存在,那么就创建它.如: $ b5 }: p% Q! {# k
: > data.xxx #文件"data.xxx"现在被清空了. 与 cat /dev/null >data.xxx 的作用相同 然而,这不会产生一个新的进程,因为":"是一个内建命令.4 S# F+ r4 e) h4 X; H
在和>>重定向操作符结合使用时,将不会对想要附加的文件产生任何影响.
6 ?2 F$ ?( ^3 O0 D如果文件不存在,将创建.
3 p5 s8 i8 e; f1 v* 匹配0个或多个字符;数学乘法;**幂运算
$ P8 b% d! c) s5 D4 z0 E5 }4 |/ s1 M8 A$ Z6 V# r; k1 ^& ]
? 匹配任意一个字符;但在((a>b?a:b))表示c语言中的三目运算
9 u. E- J, E) u0 v1 g
$ U7 B: U1 d, T3 m6 \/ Y$ ) ^ ]+ t1 I; t8 a
取变量的值 echo $PATH+ ]2 ?5 ~( Y7 F, l
正则表达式中表示行的结尾
_1 P% y! J( h- {, U${} 参数替换 ${PAHT}6 F& P, F( f. A6 L9 _+ q5 I
$* 所有参数9 L, Q ~) Z5 s1 y2 p1 q/ B$ v
$# 参数个数% b' f. u1 q% D2 u$ F4 H" S. w
$$ 进程的ID, l6 a- e3 h$ a( b L3 T1 k8 C
$? 进程的返回状态4 B1 |' v$ v, Z; T
( )
( g9 U! P# N0 ?+ I7 G命令组,在一个子Shell中运行 (a=3;echo $a) 其中定义的变量在后面不可用
1 y1 [# m/ V. M, ^2 W数组初始化: array=(a,b,c) Q9 X8 X% N2 h& Z
{ } 代码块,即一个匿名函数,但其中定义的变量在后面依然可用3 k) h# x' O- p, S
8 O( z: k& m6 |3 ?2 t
{ } \; 用在find的-exec中 $find -name *.txt -exec cat {} \;. k! `! e$ U7 F0 L0 o% x/ l2 m; \4 c
- ^7 l7 G' |# J3 V
[ ]
c- C. B# \- [6 \. R! u! o测试 [-z $1]
* }: Y! Y5 e0 e数组元素 a[1]='test'' @5 R& @4 W' o- J5 Z# F8 `/ b7 o
[[]]表示测试 使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如, &&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.
, R* |/ m8 @4 A- O/ c$ N(( ))数学运算
! I8 P$ q; d1 C; `) m在正则表达式中表示范围 [a-z]% s5 ~7 Q" _( G8 n; A g! I
< << > 重定向和进程替换 ls -al > a.txt
7 s% P \7 A5 q/ [8 Q7 R# v- r4 k& j* q& E. y1 Z8 t% a/ o( Y: |
> < 还用在ASCII比较 if [[ "$veg1" < "$veg2" ]]
+ L! u: x6 \# i# t" y9 H( q( W4 F4 l" p; ` f
\<,\> 正则表达式中的单词边界.如:bash$grep '\<the\>' textfile
* u! I* `( A3 ^3 i5 h6 y# @) E3 o3 ^| 管道# F( G# L, Q3 L9 m: q
>| 强制重定向(即使设置了noclobber 选项--就是-C 选项).这将强制的覆盖一个现存文件.
+ \! ^3 m D7 Q+ v, I|| 逻辑或操作 ;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 false,继续执行下一个命令. z, B; h- y: v! ^; @" Q
&& 逻辑与;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 true,继续执行下一个命令
9 y) B) F& ~$ G5 G& 后台运行
9 S0 m2 M$ U+ F* q6 F* V+ q$ q-! d+ m; o6 y' w3 E; H9 s
参数选项
( R" ] {' h$ }! c% H减号9 p+ o- Z/ v) G4 c3 i' q* v' u
重定向stdin和stdout:cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -), W# k: T' V' y. e
先前的工作目录 cd -; @3 h b# A# ~: _2 @/ Y0 H
注:使用-开头的文件名和变量名可能会出现一些问题
$ @. e+ o. l- u4 o( g/ |( j! s! R+ 一个命令或者过滤器的选项标记.
5 y6 O! T' i6 U' _' K( D~ home目录
& |) i+ ~* l5 ]; M~+ 当前工作目录+ O! C- R) X2 q. e/ S. r! j: s) M
~- 先前工作目录
) B1 @1 a) j& \' x^ 正则表达式中表示行首
' N$ k: M0 J8 o0 E, p( E( U" }4 }$IFS 用来做一些输入命令的分隔符, 默认情况下是空白.( K- q& t' K& X$ L9 q2 W
控制字符* s' V5 E( `. S% r+ d" c, _- V; k2 N
/ G7 z7 c4 t' w) O$ K
修改终端或文本显示的行为. . 控制字符以CONTROL + key这种方式进行组合(同时按下). 控制字符也可以使用8进制或16进制表示法来进行表示, 但是前边必须要加上转义符.
# O1 T( |, f A d3 T) X, q0 g( p+ a5 J# R- e2 r+ f
控制字符在脚本中不能正常使用.
7 }6 v* [! m3 Y4 K$ L6 n6 o7 I* K" Y4 F+ c
Ctl-B退格(非破坏性的), 就是退格但是不删掉前面的字符.; |5 { G! ^! y. O! X% C, p! `' M* z4 U
8 T( |/ k* i4 L: \+ r) oCtl-C终结一个前台作业.
+ x* \& L" t; G2 y
( ^# r& x8 Q9 y0 k: R& \% e' `. NCtl-D 从一个shell中登出(与exit很相像).7 P8 s; z, C6 a
"EOF"(文件结束). 这也能从stdin中终止输入.
" g+ {3 r# V0 `. g( U 在console或者在xterm窗口中输入的时候, Ctl-D将删除光标下字符. 当没有字符时, Ctl-D将退出当前会话, 在一个xterm窗口中, 则会产生关闭此窗口的效果.6 B9 m/ X% A/ r9 Q. G/ x
4 }; p$ C3 K/ `$ K% J
Ctl-G "哔" (beep). 在一些老式的打字机终端上, 它会响一下铃.; s( {9 p0 m" y$ o, _& k0 i u
4 O5 l* |* N9 QCtl-H "退格"(破坏性的), 就是在退格之后, 还要删掉前边的字符.2 y9 m$ h7 _+ ^8 _5 w* r
- V4 x0 F$ M9 KCtl-I 水平制表符.
. }& c" }6 G- w1 |
3 K9 N9 Q H. i9 G6 ?2 ICtl-J 重起一行(换一行并到行首). 在脚本中, 也可以使用8进制表示法 -- '\012' 或者16进制表示法 -- '\x0a' 来表示.2 l/ f& J. \7 x- \: @6 \
) A) z3 H0 o8 g) c
Ctl-K垂直制表符.
1 O) g, y( U9 K8 T# x; k6 e5 |. j( Z% ~+ _
Ctl-L 清屏(清除终端的屏幕显示). 在终端中, 与clear命令的效果相同. 当发送到打印机上时, Ctl-L会让打印机将打印纸卷到最后.+ t! V: U5 R. ?8 q! | K. ~0 ~& q
$ r+ }2 n7 u" N/ j! ]Ctl-M 回车.
. Q2 b2 m+ g H8 T, j3 }) L2 j4 c' r/ x. `3 V6 k x
Ctl-Q 恢复(XON).在一个终端中恢复stdin.6 _, I6 N! e; w% W3 ?
3 w* H/ f1 z; Y' G2 @
Ctl-S 挂起(XOFF).
8 B# @9 J( }5 R) A/ m& ` 在一个终端中冻结stdin. (使用Ctl-Q可以恢复输入.)
( G- a4 I' B5 g1 ]+ m' k* G6 i r3 d: {! H5 ~" {. K1 p/ p" y
Ctl-U 删除光标到行首的所有字符. 在某些设置下, 不管光标的所在位置Ctl-U都将删除整行输入.
$ ?5 ?$ b. \& n9 y: L7 S# W1 H& V$ Z1 P5 Y
Ctl-V当输入字符时, Ctl-V允许插入控制字符.
. N, z3 W2 z# M j! O# `
* e: W/ J8 T1 F' i4 HCtl-V主要用于文本编辑.$ X8 _! {0 s7 x
w7 b1 Z8 j! e+ t8 q1 `Ctl-W 1 U8 p/ l4 h8 j- `7 _
当在控制台或一个xterm窗口敲入文本时, Ctl-W将会删除当前光标到左边最近一个空格间的全部字符. 在某些设置下, Ctl-W将会删除当前光标到左边第一个非字母或数字之间的全部字符.
; Y" d$ }/ } q( H# I) g4 q
$ ]5 ?3 [ e0 @/ rCtl-Z暂停前台作业.
; O0 _3 ~3 B( F参考:《高级Bash脚本编程指南》 |
|