EDA365电子论坛网
标题:
Linux Shell中的一些特殊字符
[打印本页]
作者:
pulbieup
时间:
2020-3-23 09:50
标题:
Linux Shell中的一些特殊字符
# @- T3 p$ y4 y/ b# @; X2 P
特殊字符
' n& }/ t( {: d& Z
" W3 ?5 @. [- i* j. P, C% d
# 注释
. u# C+ x: Y6 T$ r) M
表示注释 #注释
% v. M5 m( u; b$ |. x" F- U
在引号中间和\#等表示#本身
: Z( X' V* K* R% x8 A: q+ V
echo ${PATH#*:} # 参数替换,不是一个注释
& |: M) j3 L1 s5 H8 n1 s
echo $(( 2#101011 )) # 数制转换,不是一个注释
9 m8 a8 n0 _' b7 S& b2 L
n6 }) V8 O6 D% v0 G0 l b
; 分隔
. _: ~; X" S* E2 Y& w& s- c$ W
命令分隔,在一行中写多个命令 echo "aa" ; echo "bb"
& U% x6 H! i* X3 `# s& L
在条件中的if和then如果放在同一行,也用;分隔
8 ?( M6 h( U8 b- \4 |
;; case条件的结束
" o: f) F, x$ R
( w y# K" o2 S& T6 O
. 命令相当于source命令
' [* y Z4 C: O" g; y! Y
命令:source
8 A/ A# ]: x- q
文件名的前缀,隐藏文件
+ i) K& @/ g2 N- c
目录:.当前目录,..父目录
- s. i5 k1 [1 P8 v( O# w) b5 l: H
正则表达式:匹配任意单个字符
" N) M9 p* P5 M1 e# f* e% X
"" 部分引用 支持通配符扩展
6 U [3 F9 J z* `5 q! a5 u6 a# G
0 `: {5 G6 I, o9 G/ y
' ‘ 全引用,不进行通配符扩展
( N6 h# }7 E0 V2 q5 _
, @2 W t% }+ |) C' L% D9 X
\ 转义
* J( k' C* @7 l
0 T1 k: q' b1 s, U
/ 目录分隔符
8 s9 H% P0 v, w) ]3 u. o+ [
& M4 ^; T* ~, _7 Z' c$ m" B$ b9 ?8 F
, 多个命令都被执行,但返回最后一个
. q. w3 W n, M m
* `# n9 U5 J i6 A
` 后置引用
6 ?! c% Z# L3 N. i/ x4 p
6 |, J" a* X) I
: 操作符
- N s; L9 y, p0 ?
空操作
0 h$ ?7 t' x; F; k$ K- f1 ~' u
死循环: while :
0 _, n3 \1 _; i+ `1 m& F
在if/then中表示什么都不做,引出分支
7 w& l4 I8 S( p1 k8 k- K
设置默认参数: : ${username=`whoami`}
) t/ ^0 R& D) M8 U; s
变量替换: : ${HOSTNAME?} ${USER?} ${MAIL?}
6 K5 S4 t3 F8 o( k
在和 > (重定向操作符)结合使用时,把一个文件截断到0 长度,没有修改它的权限;如果文件在之前并不存在,那么就创建它.如:
! J# l D1 z/ d
: > data.xxx #文件"data.xxx"现在被清空了. 与 cat /dev/null >data.xxx 的作用相同 然而,这不会产生一个新的进程,因为":"是一个内建命令.
* D: v8 I0 j; @3 C+ ]
在和>>重定向操作符结合使用时,将不会对想要附加的文件产生任何影响.
; p. ~+ Z+ ]7 u O) e) ?8 [* M
如果文件不存在,将创建.
/ m( w% d# R( }2 x( Q$ G
* 匹配0个或多个字符;数学乘法;**幂运算
# h y9 z) X* T3 C
* m1 o4 r. _4 T0 D4 R h
? 匹配任意一个字符;但在((a>b?a:b))表示c语言中的三目运算
, t2 k. ?* D3 O# g3 ~) ] B9 C
$ L" G( |# x& V% b# x2 T5 ~4 j
$
. z& s& B/ W8 j% ^& L/ X0 f
取变量的值 echo $PATH
! j0 ?1 f2 |. e9 ] y/ I
正则表达式中表示行的结尾
3 `0 l$ }: `+ n b& Z. G
${} 参数替换 ${PAHT}
" S8 }5 L" ?0 q. b( N# j
$* 所有参数
5 A# t: @) t( V7 L
$# 参数个数
4 F" g1 ?/ M {; k& I1 e2 X
$$ 进程的ID
: @% _' A& \; @, g+ G
$? 进程的返回状态
9 w7 \4 F5 L3 A- D# [3 z5 t2 T( k- _
( )
2 u/ f) _- `; U9 x' h- G
命令组,在一个子Shell中运行 (a=3;echo $a) 其中定义的变量在后面不可用
6 ?3 ~' ~" F: w- F j1 h
数组初始化: array=(a,b,c)
, x3 s9 z8 _" @4 q9 X" s
{ } 代码块,即一个匿名函数,但其中定义的变量在后面依然可用
' I8 N5 O2 V6 q( @; [
( w9 \" d: c! A2 u% u1 \3 q
{ } \; 用在find的-exec中 $find -name *.txt -exec cat {} \;
& l1 {$ ^0 i- P; Z, o
5 J3 @8 r3 E5 }. V
[ ]
) W" K+ \' t& o) y
测试 [-z $1]
& z& j9 ?3 _( H* d. Z+ I
数组元素 a[1]='test'
* f. m! V9 |& w
[[]]表示测试 使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如, &&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.
! r5 \! O) k& U3 E0 |
(( ))数学运算
5 g3 z" ~% D3 p. j
在正则表达式中表示范围 [a-z]
0 J. l4 d, J. Y" B" Q( `6 [2 A# [
< << > 重定向和进程替换 ls -al > a.txt
O1 N+ P; F; Z: A
; j0 Z$ n5 E8 p/ z7 ^3 y
> < 还用在ASCII比较 if [[ "$veg1" < "$veg2" ]]
& L* j- L d7 ?" p' C+ u
7 ^% |/ O$ f* N2 }/ A
\<,\> 正则表达式中的单词边界.如:bash$grep '\<the\>' textfile
% A0 A0 o( V+ P* p' s- n' m5 [
| 管道
( `$ E, c% O9 p) P9 }
>| 强制重定向(即使设置了noclobber 选项--就是-C 选项).这将强制的覆盖一个现存文件.
0 h# H- K9 o9 [1 M, ]. _7 f7 c
|| 逻辑或操作 ;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 false,继续执行下一个命令
- Q" a: k. P1 J4 t: u
&& 逻辑与;用在两个命令之间的时候,表示在前一个命令结束时,若返回值为 true,继续执行下一个命令
7 o' |' Q0 N7 c) }
& 后台运行
0 p+ r! N4 M+ U! o
-
4 O3 V; @' j0 x6 w9 A
参数选项
# @% k3 ]5 k# s; o
减号
' |+ m' Q' e6 m1 P1 R
重定向stdin和stdout:cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
/ y: }) o p% h, T& X, \
先前的工作目录 cd -
4 k8 o" B3 ~5 T0 q7 z
注:使用-开头的文件名和变量名可能会出现一些问题
% [+ U9 ]3 m! m& \4 A
+ 一个命令或者过滤器的选项标记.
: d0 {# I* O# m, r. Y z- t
~ home目录
! j. I- C6 T: L ]5 z
~+ 当前工作目录
7 S( P) x* Q0 y! I
~- 先前工作目录
: y5 @5 Y) l3 y
^ 正则表达式中表示行首
L+ f6 N% S" j& F* C
$IFS 用来做一些输入命令的分隔符, 默认情况下是空白.
! `. k7 r5 N2 W! F3 q
控制字符
. o8 l) q. l9 @& L
+ Y0 h: o# d, h
修改终端或文本显示的行为. . 控制字符以CONTROL + key这种方式进行组合(同时按下). 控制字符也可以使用8进制或16进制表示法来进行表示, 但是前边必须要加上转义符.
% r2 c6 @+ M7 L& S; \2 F
) [+ E- _1 x! c/ ?% w
控制字符在脚本中不能正常使用.
7 R# k, M+ L) \% g9 z: r
6 L4 I/ `0 _ e7 o% e- Q) ]; R
Ctl-B退格(非破坏性的), 就是退格但是不删掉前面的字符.
2 ]" h' i% d& A7 R
2 J+ W0 I- I, Q
Ctl-C终结一个前台作业.
0 ^) J; N/ b0 o- O6 E9 e, b
5 {3 w w1 |9 Y9 b4 l
Ctl-D 从一个shell中登出(与exit很相像).
+ _ R: O$ d% o3 W s: A; B
"EOF"(文件结束). 这也能从stdin中终止输入.
1 U# G) p2 |* X9 \% @9 `
在console或者在xterm窗口中输入的时候, Ctl-D将删除光标下字符. 当没有字符时, Ctl-D将退出当前会话, 在一个xterm窗口中, 则会产生关闭此窗口的效果.
& G) Y8 r) x# p/ F* Y& m
0 X: H! {+ I' C+ x4 X0 }
Ctl-G "哔" (beep). 在一些老式的打字机终端上, 它会响一下铃.
! f0 ?: U/ O$ E6 M/ O, o; s
; Q/ g6 ^9 N/ F/ ?5 A& c. D" v5 j
Ctl-H "退格"(破坏性的), 就是在退格之后, 还要删掉前边的字符.
* @; ?# z7 S5 m( l4 a, n
* X& m9 K' m9 v2 m2 n" O5 A
Ctl-I 水平制表符.
- ?$ V& I5 ]: d/ e- ?8 E0 w
, @4 V2 \ ~2 {" C* W
Ctl-J 重起一行(换一行并到行首). 在脚本中, 也可以使用8进制表示法 -- '\012' 或者16进制表示法 -- '\x0a' 来表示.
+ F# s8 @' a9 _ P. E
' U- F; [1 N8 c7 q9 [2 \' H9 D7 }
Ctl-K垂直制表符.
- f3 ]5 [( o3 V4 C
9 s6 A1 h. @" g* p; P
Ctl-L 清屏(清除终端的屏幕显示). 在终端中, 与clear命令的效果相同. 当发送到打印机上时, Ctl-L会让打印机将打印纸卷到最后.
2 f6 j/ ? y% r5 u% p. t
2 @4 r F& G `7 v' K4 {
Ctl-M 回车.
; H# Z! X- ]* F* m) T- R
! j7 z L2 b# l) U- R
Ctl-Q 恢复(XON).在一个终端中恢复stdin.
& z$ p& ~0 J# F. d. D* |8 R; \; I1 C
2 J& j4 `- a% K7 y
Ctl-S 挂起(XOFF).
+ }- B/ P6 T8 K
在一个终端中冻结stdin. (使用Ctl-Q可以恢复输入.)
6 E& x6 R$ j9 ?+ v9 D
+ e L) `) x- F$ L$ R& q2 a
Ctl-U 删除光标到行首的所有字符. 在某些设置下, 不管光标的所在位置Ctl-U都将删除整行输入.
t+ A1 c2 V$ V7 t6 o% Y; Y' I
5 A! W/ r$ ^, d Q# a
Ctl-V当输入字符时, Ctl-V允许插入控制字符.
4 r, M) Y8 x7 _9 n) b$ @2 P
0 W. R% \0 V% [, U
Ctl-V主要用于文本编辑.
5 W' t0 P1 B) D7 R5 R
' H) g5 N$ R) i
Ctl-W
8 Y5 l& q# m# N4 a( j
当在控制台或一个xterm窗口敲入文本时, Ctl-W将会删除当前光标到左边最近一个空格间的全部字符. 在某些设置下, Ctl-W将会删除当前光标到左边第一个非字母或数字之间的全部字符.
0 y1 ^5 M; ?$ [/ P& ], r
5 C, |: _* E2 Z" ]6 Q! |) Q# Z8 ?" \
Ctl-Z暂停前台作业.
7 t3 j" D, l* u" X7 X
参考:《高级Bash脚本编程指南》
作者:
yin123
时间:
2020-3-23 18:42
Linux Shell中的一些特殊字符
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2