|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 }' I; I L% L8 v0 }6 S, L
特殊字符
* C9 d' b( e9 _/ [
3 g8 \6 \. l6 E- b" g# Y* }7 l. H# 注释" {% w# ^; w: j% X4 W/ i
表示注释 #注释; P- x. S% J0 B' W8 t) y+ X5 ?. [
在引号中间和\#等表示#本身
9 K5 I. b, _# q, _9 decho ${PATH#*:} # 参数替换,不是一个注释- s7 g0 N% l# j+ }: `* X# O- P
echo $(( 2#101011 )) # 数制转换,不是一个注释
4 Z8 }8 g0 }# d- L# q2 o% R: u' M; Y5 i4 S3 |
; 分隔7 d9 w+ N6 Q6 [1 V
命令分隔,在一行中写多个命令 echo "aa" ; echo "bb"
, p: u O% o) l6 X* w! L在条件中的if和then如果放在同一行,也用;分隔$ s) c& q% `: j( u/ P' w" t+ r
;; case条件的结束+ r5 M r5 z# d0 W
2 x( _# g' b& n- p: I$ n. 命令相当于source命令
! E+ Q2 H/ e( I7 M' B命令:source* v; O" @( r0 X) G% b0 F
文件名的前缀,隐藏文件- m, u' o4 \& i8 f% n1 n
目录:.当前目录,..父目录3 y5 S9 v% H" q7 U' z! h8 I2 {
正则表达式:匹配任意单个字符5 |6 @0 t# a6 e: \' R! R
"" 部分引用 支持通配符扩展2 q3 d# i/ y1 a
4 r8 Z V( s9 v' ‘ 全引用,不进行通配符扩展5 M! V% T/ T& e, }- k5 C
/ V: h6 f( H p. n$ F0 m
\ 转义
8 @) Y3 n" _3 I% b {0 ^5 l
6 A( l5 W( W* s& Q1 z9 b1 Z3 [/ 目录分隔符& n; {" X) a* }* r6 ~$ }* a
. x) E- C; Y( H0 Y. q8 k, 多个命令都被执行,但返回最后一个
1 k5 m1 j5 K. v8 m8 e! w
. _, T: L" i# T/ \, e` 后置引用
& }4 A; e9 d' f8 m+ I" V7 m+ }
% B3 l" i8 E, Y) f8 |6 Y; n: 操作符
. }) [/ @6 t" J% |8 C. `空操作/ D& g: k6 Y+ k
死循环: while :! d! e, d( |8 N# `( E
在if/then中表示什么都不做,引出分支
6 `% N1 }# f# n) A; m3 }& L设置默认参数: : ${username=`whoami`}( E0 y2 N! g3 E$ z O2 Z
变量替换: : ${HOSTNAME?} ${USER?} ${MAIL?}, X% Q7 `' C/ M. T
在和 > (重定向操作符)结合使用时,把一个文件截断到0 长度,没有修改它的权限;如果文件在之前并不存在,那么就创建它.如:
3 N9 \% l! h* g4 U n$ M. E : > data.xxx #文件"data.xxx"现在被清空了. 与 cat /dev/null >data.xxx 的作用相同 然而,这不会产生一个新的进程,因为":"是一个内建命令.
+ b; o# R3 [4 i在和>>重定向操作符结合使用时,将不会对想要附加的文件产生任何影响.: m; i( a u- L9 `& B+ [
如果文件不存在,将创建.5 r- q! j1 O" B# |/ g( s
* 匹配0个或多个字符;数学乘法;**幂运算( s$ H3 G" P! r; J5 {6 H7 b8 U
3 A u% Z: P, n6 K? 匹配任意一个字符;但在((a>b?a:b))表示c语言中的三目运算; q+ [. _8 a; A
& S7 b5 k) K( [9 ^$ ! l& u, Z6 J7 \
取变量的值 echo $PATH
1 [. }9 k2 T5 e正则表达式中表示行的结尾
6 S6 E( L. I" P3 e6 N${} 参数替换 ${PAHT}
5 \5 {) d8 i0 O5 h$* 所有参数
4 k' e7 t( y% F1 D& `0 n$# 参数个数
# D$ J" L5 @- y( K$$ 进程的ID
" U/ A- u U' F0 X8 ^! T+ G$? 进程的返回状态9 p. T8 `5 h6 ~$ H, [! N& j
( )
3 ]5 w7 X; r! X8 g3 B5 L: Q命令组,在一个子Shell中运行 (a=3;echo $a) 其中定义的变量在后面不可用9 x* C/ n3 Z6 F& [2 }
数组初始化: array=(a,b,c)
2 {- T, f! x$ K6 g- D; X2 ~{ } 代码块,即一个匿名函数,但其中定义的变量在后面依然可用/ o. H/ h4 [5 h9 k* A0 ~
4 Z/ H6 J9 X8 l2 n7 F; W' ~; z! m1 Y{ } \; 用在find的-exec中 $find -name *.txt -exec cat {} \;
& s! t2 b- P x0 K' I3 z' r# ~2 Q5 \8 o9 Y1 _* ~
[ ]
* E% e6 a) u# V1 `# r6 n测试 [-z $1]
2 }8 Q" S0 F& d0 F' b/ x数组元素 a[1]='test'" Q/ U. M9 V* l0 [5 Z
[[]]表示测试 使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如, &&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.: F4 i& c: W- Z+ X7 J. Z0 Q
(( ))数学运算
1 H, @# M3 h% Z& V: B/ c% z$ d在正则表达式中表示范围 [a-z] Q# X1 M9 B; `- E1 B# _
< << > 重定向和进程替换 ls -al > a.txt k& `; H9 F/ O8 U) Y
E1 e# c9 S4 J$ d# C
> < 还用在ASCII比较 if [[ "$veg1" < "$veg2" ]]
, K1 d l/ U, @% e% Q3 c( I2 W
& s" |. s6 m% H- S\<,\> 正则表达式中的单词边界.如:bash$grep '\<the\>' textfile
6 H9 v, A. Q0 C9 @ T1 f# l+ j| 管道6 R; R. ^8 ?& L `: {3 d& @ w2 P, _
>| 强制重定向(即使设置了noclobber 选项--就是-C 选项).这将强制的覆盖一个现存文件.8 n2 n p' x+ k/ L
|| 逻辑或操作 ;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 false,继续执行下一个命令- x+ e; z) x' p6 m& I6 X
&& 逻辑与;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 true,继续执行下一个命令$ |; U* f. t2 D; N* d1 z" d( L
& 后台运行% N5 l3 j/ ~! {% V
-
# ?- r v! O2 E2 I# G参数选项3 h' n$ k4 S( v/ _
减号+ k/ Y: j$ g; }4 v
重定向stdin和stdout:cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
" d& U4 k' V7 q, K* J( ]先前的工作目录 cd -
$ L" D/ [7 Y+ M0 b# }, A注:使用-开头的文件名和变量名可能会出现一些问题
; w3 n3 E/ r" L+ 一个命令或者过滤器的选项标记.7 Q, w0 \; j6 x L0 ^
~ home目录
" G+ x; M# Y) Q~+ 当前工作目录9 z9 f! d2 R: d9 X
~- 先前工作目录* c) n4 L) G& E$ P& v
^ 正则表达式中表示行首
0 X+ _8 b/ g( Z0 d( w$IFS 用来做一些输入命令的分隔符, 默认情况下是空白.5 H& Q2 P- y7 D7 k% H, @! _1 j$ N
控制字符( H# R( v" o- z* s
/ s T# f. s3 s u1 L4 a4 ?* {修改终端或文本显示的行为. . 控制字符以CONTROL + key这种方式进行组合(同时按下). 控制字符也可以使用8进制或16进制表示法来进行表示, 但是前边必须要加上转义符.
" _& {, B6 ]( y3 Z/ W5 m9 j K2 m Z. N& z
控制字符在脚本中不能正常使用.( z. N) f0 `% A) }: [
5 l( \( a0 p0 c& [4 x; k- `1 t# V4 s: ^Ctl-B退格(非破坏性的), 就是退格但是不删掉前面的字符.2 W. M$ e* k. J) p4 C
, G t3 V/ C# ^1 }6 qCtl-C终结一个前台作业.# h+ d" F1 I7 L) d E/ q O% x( {
& e1 F( m6 m" d: Q' q0 p) BCtl-D 从一个shell中登出(与exit很相像).
& K. w1 }/ i5 C: V% \4 [) H+ S "EOF"(文件结束). 这也能从stdin中终止输入./ \" E) J" g/ s4 m5 y! i
在console或者在xterm窗口中输入的时候, Ctl-D将删除光标下字符. 当没有字符时, Ctl-D将退出当前会话, 在一个xterm窗口中, 则会产生关闭此窗口的效果.9 I; e. k( G+ M4 a& ~
+ ?- R0 {, F- I& d' Z! A
Ctl-G "哔" (beep). 在一些老式的打字机终端上, 它会响一下铃.
4 T& M3 n) Y7 H. }! U" q5 p/ O2 H; u' C" @# g( ^/ T) A \ Q
Ctl-H "退格"(破坏性的), 就是在退格之后, 还要删掉前边的字符.* p) h1 V) g9 Y& U
5 k. |( D# }$ B% o0 O; wCtl-I 水平制表符. j5 c5 L: F& ? i% {
/ S1 x' O, ~5 ?! A/ B9 K/ A
Ctl-J 重起一行(换一行并到行首). 在脚本中, 也可以使用8进制表示法 -- '\012' 或者16进制表示法 -- '\x0a' 来表示.: y( c: G% ?, r; {
+ y" P- p9 B6 e# |Ctl-K垂直制表符.
: x( n! t! W- E3 l; G' c. [8 s: ^5 Y* u, V" v
Ctl-L 清屏(清除终端的屏幕显示). 在终端中, 与clear命令的效果相同. 当发送到打印机上时, Ctl-L会让打印机将打印纸卷到最后.
( ?9 Z( g' Q' {6 h
: \; k: X8 g1 |5 v* Y- t$ zCtl-M 回车.8 p/ Z% ^; I+ C4 \
- e2 B; F- A! X$ w7 p1 n
Ctl-Q 恢复(XON).在一个终端中恢复stdin./ B% o' q0 a% M! O4 x' M' i9 D# T
- t% ^# ~9 P/ T$ Y' d3 V& T. T
Ctl-S 挂起(XOFF).
6 D7 m( _: X7 h4 v 在一个终端中冻结stdin. (使用Ctl-Q可以恢复输入.)
7 p, }. N/ E1 X! z7 C$ w5 w9 k; O' }. v' T3 ?+ n+ V
Ctl-U 删除光标到行首的所有字符. 在某些设置下, 不管光标的所在位置Ctl-U都将删除整行输入.5 u. |6 W; U$ o
: a [ q% ?; V& b- v
Ctl-V当输入字符时, Ctl-V允许插入控制字符. 1 ^) g/ E4 h% e5 h, @1 L ~) m$ n
& Z7 |# D. _5 N# s8 [0 i, M
Ctl-V主要用于文本编辑.& H$ y5 l7 t2 f" W. o- D
- L( \/ t* _9 {1 ]4 }) G
Ctl-W
/ m5 L! h6 i+ V( X( s6 W( [% M当在控制台或一个xterm窗口敲入文本时, Ctl-W将会删除当前光标到左边最近一个空格间的全部字符. 在某些设置下, Ctl-W将会删除当前光标到左边第一个非字母或数字之间的全部字符.
4 M* G3 e$ k! i- B4 ?6 h6 \9 x1 v2 R5 O. ]* O" C v: O! r! D
Ctl-Z暂停前台作业.
8 e- L1 Q; o2 j7 j0 F参考:《高级Bash脚本编程指南》 |
|