EDA365电子论坛网
标题: Linux shell笔记 [打印本页]
作者: mutougeda 时间: 2020-8-28 15:59
标题: Linux shell笔记
由于工作的需要,越来越多的接触到linux系统。最近看了《Linux与Unix Shell》这本书,安装书的章节整理了一些自己认为比较重要的命令,方便以后查阅。
/ @; X9 F8 G" L* k* x5 B; D1 @No.001 文件安全与权限1. umask 决定了新建文件的权限
) r- E8 f9 r9 O' c& N& t2. 软链接(符号链接) ln -s source_path target_path
+ k/ b2 i8 a. l0 v$ UNo.002 find和xargs1. find pathname -options [-print -exec -ok]
( w& Z2 j/ d& } v* M4 u 其中exec参数的命令格式: 'command-' {} \; 注意必须包含【{} \;】 - J/ L+ B: }1 E! _$ H; [+ Z
-perm 按权限来查找 ex. find . -perm 755 -print * P" C; _' o4 i f* ~/ [& r
-mtime 按修改时间来查找 ex. find / -mtime -5 -print 更改时间5天以内
* ^! v4 R% P2 L3 g find / -mtime +5 -print 更改时间5天以前 ) s7 B9 M! B% {; f+ t% a
2. xargs与-exec和-ok类似,但是限制更少,也更快
9 l, X5 i; n3 } 3种参数的命令:find . -name "*.c" -exec wc -l {} \; * \; x1 L; j, W4 l
find . -name "*.c" -ok wc -l {} \; 每次执行命令前有提示 6 X# z! {) ]; j6 n0 f
find . -name "*.c" | xargs wc -l
$ q# I$ {: u# E" v+ @
No.003 后台执行命令1. [crontab] [at] [&] [nohup]四种
8 N7 b6 ^$ `+ HNo.004 文件名置换1. 列出隐藏文件 ex. ls .*
, N, ]! R3 o3 D# m& C3 kNo.005 shell输入与输出1. echo输出时加上 -n 参数不换行, ex. echo -n "aaaa" , |1 K6 n' @+ y, b4 P Q" [7 ]
2. tee 命令可以同时输出到屏幕和文件中 ex. ls | tee file.out * c) g; c- {6 O" R
3. 标准输入 0 标准输出 1 标准错误 2
3 K! g( k% h; d4 w4. 将标准输出和标准错误输入到一个文件 ex. command >file.out 2>&1
% G1 U) @+ p# @: n$ p0 A
No.006 命令执行顺序1. 命令1 && 命令2 命令1执行成功后才会执行命令2
0 l% Y0 \5 X9 e ]; [2. 命令1 || 命令2 命令1执行失败后才会执行命令2
! |$ O! j/ Y, P* \( j- y. c. ]No.007 正则表达式1. 正则表达式元字符及含义
: @4 q5 [7 T: t3 q% ] ^ 只匹配行首
5 n7 i$ L' U7 t2 ^4 c $ 只匹配行尾
, v9 L5 O) _% d7 H0 z * 匹配0次或多次 & x' @, U, ~: F2 d) j
[] 匹配[]内字符 0 x \5 ~( g* @! n
\ 转义符
) p9 s( ^- ^- Y% n0 ] . 匹配任意一个字符
- p- [+ Q4 b/ W' \9 W* y pattern\{n\} 匹配pattern出现的次数,n次 7 V+ N) k( u! f9 h5 A x" s
pattern\{n, \} 同上,最少n次
, [5 {# j% \2 H* r! u& u6 f4 X3 K pattern\{n, m\} 同上,次数在n与m之间
& h8 P6 j$ l7 I( D$ E
No.008 grep1. grep 主要选项及其含义
+ P: [7 t8 s L5 a -c 只输出匹配行的行数 ( p, w; D$ o0 l6 y
-i 不区分大小写
6 A! i; W5 m0 s& A -h 查询多文件时不显示文件名
2 s: S- z; `! b -l 查询多文件时只输出包含匹配字符的文件名 2 I: T9 e7 [* P& G
-n 显示匹配行及行号 6 n! M" g" C4 J- D
-s 不显示不存在或无匹配文本的错误信息
, T/ \8 _' Z" `# F' B0 G -v 显示不包含匹配文本的所有行 4 k) H# Q" ]* _1 k7 Z8 O9 S0 T
2. 查询空行 grep '^$' filename
* d: X C% h4 J" h3. 类名及等价的正则表达式 ) }( v' z4 J7 X& o3 A
[[:upper:]] = [A-Z]
' r# C, `' n4 `8 O' K0 J/ d- {, G [[:lower:]] = [a-z] - ]: Q. H5 O1 O1 ~
[[:digit:]] = [0-9] 2 a9 g9 T* g6 V, R1 N0 N C
[[:alnum:]] = [0-9a-zA-Z]
, F# q4 d: Z6 z, z2 c* z [[:space:]] = 空格或tab键 - `5 P: U6 R) u8 h4 j1 I6 d
[[:alpha:]] = [a-zA-Z]
7 H: M5 j' B8 u0 fNo.009 AWK# awk的主要作用在于将文本分成各个区域,便于分别进行处理 1 I6 d' w$ ]1 Y% `
1. awk -F指定分隔符,-f指定awk脚本 5 J8 C* [( M& S
ex. awk -F: 'commands' input-file(s) ! l: y/ N# p/ B1 j( u' {
ex. awk -f awk-script input-file(s)
: h( @- |. i; A* D2. awk 分隔出的域用$1,$2...$n来表示,其中$0表示所有域 ' O5 [9 \( }2 m1 _& r
3. awk 条件操作符 <, <=, >=, ==, !=
, u# e7 W) ]* h. x ~ 匹配正则表达式 !~ 不匹配正则表达式
- A6 o0 Z. m z4. awk 内置变量
. O" c3 w! }5 R& U( { ARGC 命令行参数个数 : }7 }4 z% D4 @' K1 y2 s- E, C, H
ARGV 命令行参数排列
J: Z6 O6 E7 ]- B9 H: t ENVIRON 支持队列中系统环境变量的使用
& R; j' C. U/ t2 K( h) n FILENAME awk浏览的文件名 / d M2 H: o. T% N4 J
FNR 浏览文件的记录数
% L- i: A. v, z% |& z: B# F/ P FS 设置输入域分隔符,等价于命令行-F选项 - R/ K5 U7 G0 o0 E* D6 @0 ~* x
NF 记录的域个数 , F q! o) ] ~# ]% Z- y$ V) G5 i
NR 已读的记录数
. E- G1 `4 X5 \0 w$ R9 X OFS 输出域分隔符
8 U5 a" g. o8 v" S) e ORS 输出记录分隔符 $ @6 H1 t3 i, x
RS 控制记录分隔符 # P w5 l6 z7 ^
ex. awk '{print NF,NR,$0} END{print FILENAME}' input-file
, r3 X: @: F# c: R, L+ T Y5. awk 字符串函数 & O f8 L4 F. m- _
gsub, index, length, match, split, sprint, sub, substr, substr
8 k! Y5 a) l2 m3 v: e' f. b6. awk 中的printf函数可以控制格式化输出
6 K) W2 L. w% P+ K9 W5 L& E/ q7. awk 的循环结构 For (element in array) print array[element]
$ _. q# B3 n- D( b' Z! X- w
No.010 sed# sed的主要作用在于过滤和查找文本中的特定内容
+ r( ?/ x# V4 f- p4 H1. sed 命令格式: sed [options] sed-command input-file
7 ~0 G; }" m% `0 t5 A sed [options] -f sed-script input-file
8 Y. W' c+ h! i$ C- L# z$ oNo.011 合并和分隔文件1. sort, uniq, join, cut, paste, split
8 B8 A' f1 R2 { h- LNo.012 tr的用法1. 去除oops.txt中的重复字符 tr -s "[a-z]" < oops.txt
& O$ w, e( O z" ?5 m2. 去除oops.txt中的空行 tr -s "[\n]" < oops.txt & Z, y; g3 ^% H4 r1 c) i' @% _
3. oops.txt中小写转大写 tr -s "[a-z]" "[A-Z]" < oops.txt
4 D+ ~7 A. m F# r6 V$ D3 hNo.013 登录环境1. /etc/passwd 保存所有账号的基本信息(不包括密码)
0 y: {0 @ @' \7 S; P2. /etc/profile 基本的配置信息,登录时读取此文件
& i. b0 R5 m$ }8 n3. $HOME/*profile 各个用户的profile文件,会覆盖系统的profile文件 + u+ e9 h, @$ S2 T9 Y/ a9 W: K
4. $HOME/*logout logout(键入命令exit时)是执行的脚本
. |0 e+ Q# C* R6 k3 }3 J) s6 s# {0 ?
No.014 环境和shell变量1. shell变量的设置方式 ( n" L, K4 A! p6 W N
Variable-name=value 设置实际值到variable-name 6 A4 ` P) M0 r1 Y% E
Variable-name+value 如果设置了variable-name,则重设其值
D0 c( |6 A% ^$ T Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息 # e% b. X$ T3 K$ `+ J
Variable-name?value 如果未设置variable-name,显示系统错误信息
# @3 B$ w( b4 X+ M/ B) a Variable-name:=value 如果未设置variable-name,设置其值 9 A1 R$ X9 j* F- a% h, v) ^
Variable-name:-value 如果未设置variable-name,就用value,但是不设置variable-name , @6 f0 ?/ x1 |/ z2 ?0 P( e8 p; W, s" {
2. 设置只读变量 readonly variable-name
' M2 v3 h- D2 ~7 w: k, d6 b3. export variable-name 可以将变量导入到子shell中 0 J4 i4 v; {8 {; f7 k) b# d7 r" K
4. shell脚本的参数 $0表示脚本名字,$1表示第一个参数......$9表示第九个参数
9 B: U. N3 \8 n7 D7 R4 h8 _5. 特定shell变量
8 A8 h7 y4 N6 k! } $# 参数个数
8 A8 x# B- }( l5 G+ N $* 用一个字符串显示所有参数 H1 [! Y' o: V7 @% W/ f
$$ 脚本运行的当前进程ID
$ }9 G. s# B! f+ X! A $! 后台运行的最后一个进程的进程ID ; K: m& X+ q, Z/ t9 p
$@ 与$*相同,每个参数作为独立的字符串 " a% u5 k6 F4 x$ C9 O) i- M( _
$- 显示shell的当前选项,与set命令相同
4 l9 k3 q- ~% L: K5 S9 _( ^ $? 显示shell命令的退出状态,0表示无错误,其他表示有错
- X# X: w( ^6 D* M8 I2 K8 M/ W/ xNo.015 引号1. 双引号("") 其中引用的变量会替换为变量值。比如: 9 {% F; w7 Y! ~
[wangyb@localhost bash]$ STR="Hello world" ! ~0 Y) M( R( F( q( c/ J
[wangyb@localhost bash]$ echo "$STR"
' J0 ]; Y( b) U Hello world 0 b2 a% q7 d' ]
2. 单引号('') 忽略变量和其他特殊字符,单引号内任何内容都当成字符串显示。比如: 4 Y. d$ O, P' O8 D( ?' T
[wangyb@localhost bash]$ STR="Hello world" 8 \( |+ h( s3 X5 h' C' N/ m
[wangyb@localhost bash]$ echo '$STR'
8 x2 L) M/ W( ]/ B) Q% H$ _, Q $STR 7 w' P! i6 n" n+ Q& M, i% D
3. 单引号和双引号同时使用时,谁在外面谁起作用。比如 1 P! P, K: f. J4 r4 v9 `
[wangyb@localhost bash]$ echo "'$STR'" / ?! c& {/ H+ ~0 P! X4 ?
'Hello world' / x+ V" @- e$ H# t, v
[wangyb@localhost bash]$ echo '"$STR"'
- M$ e! B- ]+ ` "$STR"
9 j% T Y7 @- s s4. 反引号(``) 反引号中的内容被当做命令来执行。比如
- W z' q$ u$ }3 P [wangyb@localhost bash]$ VAR=`date` * A5 b5 Z' e# o g. V3 ]
[wangyb@localhos bash]$ echo $VAR ; K7 O! l2 t. Y( b) c
Thu Dec 22 22:08:07 JST 2011
* j) Z. b; P/ n5. 转义符(\)
1 M8 k# R$ |! p$ q2 s" N- k
No.016 Shell脚本介绍1. 脚本的第一行一般以 #!/bin/bash 开始 , @5 o I4 V: Y; T# t
2. 给脚本加入执行权限后就可以运行脚本了
# c- D, r3 P8 `! e2 O#No.017 条件测试1. 测试语法 test condition 或者 [ condition ] 使用方括号是注意在condition两边加上空格
, Y# s" S& n2 _& X2. 文件状态测试 : g/ M8 d& \/ k/ j/ q+ k
-d 目录 -s 文件长度大于0
" E- A2 A8 X. r -f 正规文件 -w 可写
' {5 K% H0 I9 o- n v1 G3 r -L 符号连接 -u 文件有suid位设置 + n% l9 r/ e# d2 `& _" G
-r 可读 -x 可执行
/ } C# J1 e1 \, @! d2 @ 例子如下:测试是否为目录,也可以用 test -d bash.sh 来代替方括号 $ q. l* r) J! {' b& W
[root@localhost bash]# [ -d bash.sh ] ! C" U0 \/ Z2 U/ I( n7 [) s
[root@localhost bash]# echo $? ! I$ G4 c: U D7 ]+ Z# q
1 5 G( ]0 D7 r/ f) ]2 l {
[root@localhost bash]# [ -d . ] 6 b( a5 }4 \- v5 \+ v3 ~! a' p
[root@localhost bash]# echo $?
* o2 u; D! t, Y 0
, f7 M& ?3 p. Q2 \: e1 ~3. 逻辑与 -a 逻辑或 -o 逻辑否 ! 例子如下: # h6 m1 e- B! d" B# D; P2 {' `
[root@localhost bash]# [ -d bash.sh -a -d . ] * r8 B9 l! ?9 S, N' ? [( J% Y8 r
[root@localhost bash]# echo $? 8 w2 [2 z1 x# m1 g* f5 k! @" c
1
" d$ X/ z# S: c [root@localhost bash]# [ -d bash.sh -o -d . ]
, \; w4 s! A2 l( j+ K* v! G; I [root@localhost bash]# echo $?
; J: E9 m w1 I3 y$ I$ R0 X 0 * M8 M* {0 D+ Q7 k+ j$ m) e
[root@localhost bash]# [ ! -d bash.sh -a -d . ]
$ f% l- d2 l" C% _1 q5 \. m8 v3 } [root@localhost bash]# echo $? + a3 O) |8 m8 d% {/ S) q8 k9 e
0
$ @1 y7 \& o' Q, h- n1 \- ~$ j9 G [root@localhost bash]# [ ! -d bash.sh -a ! -d . ] 7 U2 h* o% T6 m, C. w5 ~% z
[root@localhost bash]# echo $? / N; t3 Q/ c8 V1 N! r
1
1 r& m. |- o$ l+ J+ _4. 字符串测试 [ string1 string_operator string2 ] 或者 [ string_operator string ]
0 n/ }7 h5 G/ g8 u9 ? string_operator可为:= 两个字符串相等
( L* l8 [ S9 l P6 q, J != 两个字符串不等
: P( Q0 h9 [2 w* O. E1 |& P2 e9 E -z 空串 1 ~3 G- m3 ~7 m. N" P* X% R0 ]! ~
-n 非空串
9 p1 |( c" k5 I5 U5. 数值测试 [ "number1" num_operator "number2" ]
& [- Y; |0 \5 H7 y1 F" B1 [ num_operator可为: -eq 数值相等
# _0 i' p& Z+ Y: } -ne 数值不等 0 K1 P# O. I2 h8 ?
-gt number1 > number2
7 T4 N6 ?! \$ j9 f/ `) R -lt number1 < number2 # ?) k2 ?0 }' x' j9 o
-le number1 <= number2
6 }# M# i8 z, A7 |; Z- O' e+ _ -ge number1 >= number2 9 F7 Q# g, V* f9 j$ S
例子: [root@localhost bash]# [ "100" -gt "101" ]
3 p$ Q4 q* i& _1 h [root@localhost bash]# echo $?
# C1 G" I+ N: i/ @2 ?: ] 1
3 R; [/ j" H! @5 ]2 n( g [root@localhost bash]# [ "100" -lt "101" ]
$ n* j8 d, E! D: e5 t G [root@localhost bash]# echo $?
0 b$ Q! _( M& G& r% h9 M 0 . t1 \7 i& m) R
6. expr语法 expr arg1 operator arg2
- U- \# z# L/ }' u( R 例子:变量自增 $ h: `: R% n9 c7 ?$ U
[root@localhost bash]# COUNT=1
; e# P/ l' w( y: l- l2 I [root@localhost bash]# echo $COUNT 0 G" w, D: D5 s3 f7 I) ?. o
1 & c7 a. Q3 u5 O
[root@localhost bash]# COUNT=`expr $COUNT + 1`
/ C$ m3 I3 B. v I1 u+ l [root@localhost bash]# echo $COUNT " S# f8 a1 ]3 b V+ f+ @, ]
2
9 o2 ~. Y$ u! w: _" VNo.018 控制流结构1. if语句格式
% B5 F: d1 s$ F9 i if 条件1 0 y, d7 | @- s7 n
then 8 q, B8 y# {8 C, g* _# K$ d0 G& x
执行命令1 " N" v$ Q3 o8 Z
elif 条件2 : [4 P n8 A. K/ N# s8 `4 b: a
then ' l6 j* M# n+ z8 u
执行命令2
6 u$ q/ s& e" I% G. c1 V else . `6 i& ]( V; ^% ]" D+ l- J
执行命令3
& p/ R2 @" M. T5 `( }( {6 `' T fi
1 y: n% |' T& y5 P7 B0 t2. case语句格式
& S9 J+ K6 [1 I6 E case 值 in
* u( O7 u) X9 ~8 V 模式1)
! F1 V0 L% F2 A/ D) W7 s- Q 命令1
1 n3 T* z2 D* M/ Y; M- O6 Q( y ;;
6 J% g8 k! V; ~3 W/ ] 模式2)
0 V- y; ^( \( E M' a 命令2
; W; I, H5 l" l+ U ;; 3 Z0 ]7 @0 Z: w7 O7 d. G$ @1 B
......
) ?- |, ^& s" e- _8 W; J+ Z easc " u0 i( w H8 i% c
其中的“模式”可以是 *(任意字符), ?(任意单字符), [..](范围内任意字符)
) A% d+ T; Q. H$ S2 ~“模式”中还可以是使用 | (比如 str1|str2 表示str1和str2都可以)
5 I( z* ~* {7 [, x3. for语句格式 1 |, |6 P# m9 t+ }+ r
for 变量名 in 列表
0 V' |" ]& h# U7 I( k) o do
+ A; Q B1 y: f$ f" g 命令1
0 Q& O* p3 I; ]& | 命令2 ......
5 F D2 t% T/ [% o done * s7 E1 y) H! ]4 j+ Y0 f1 ?
4. until语句格式 6 q- t& j1 ]' B% s" Q1 o/ q
until 条件
( S J/ V6 S$ p/ M+ M# B 命令1
; b$ M3 j3 ?2 V& M, r( t ...... $ ?% i) i) O: ^3 u
done " R" p* i0 O8 h7 g3 l q* D
一直执行至条件为真时才结束,至少执行一次 6 |1 s( X3 h5 `$ u* Y
5. while语句格式
7 ?, m; f( o2 |) c3 W/ H; ~3 z while 条件 : K' f1 Y0 x% _1 P9 [6 R) a
命令1 : e. i9 V- i" L! `# V( G6 h& U
...... 4 _; [- x- ^. }, k A D, P6 @
done
. B& F* d0 s) ]$ x4 q1 b, b6. 利用IFS来改变读取内容的分隔符 0 ^9 r7 l1 V# Y- J) n$ P
7. 利用break和continue控制循环的执行
! @" j% T, x6 e R. G! s
No.019 Shell函数1. shell函数格式 , n" Y3 j. s5 x# v
函数名 ()
: o1 H4 h3 P" z# r9 o* m { * R' I' u5 z. V
命令1 9 F0 P8 x) C M# U3 A9 S9 Y% P
......
4 K+ D; q9 V3 @1 [2 z1 A2 y' V6 I- z }
- C, w, P# {3 t# P或者 6 g0 I( Y% E/ d
function 函数名 ()
- g8 \ G. s, o! @3 b { 5 p- m2 P0 _* g; `8 v6 H3 {' h
命令1 3 A# Z# j* C7 v% ]
......
! v2 g, L" `* V! s7 I } $ l, e- }4 i& d* P, Q' i
2. 引用其他脚本中函数 . /pathname/funcfile (<点><空格><斜线><文件完整路径名>或者<点><空格><文件相对路径名>) 0 B' }# [# ?) F
3. 函数中通过 $1, $2,......$9来获取参数
9 r/ p }4 g" |$ p: r' | t% U: k
No.020 向脚本传递参数1. 使用shift依次获取各个参数,比如 ! G# y8 _" F# e: u
while [ $# -ne 0 ] $ I! }7 z; q7 u
do " B. O; V* I0 g/ c
echo $1 # 通过shift,$1将依次表示各个参数 & ?8 R9 d0 Q' a
shift
. B+ c' b/ T9 ^) O done
7 U! ?5 B j8 M- ^! v* W2. getopts语法格式 getopts operation-string variable。
( ]3 u& ^0 `* w2 `4 B7 s
No.021 屏幕输出1. tput 控制屏幕上的字符输出,比如加粗字符,隐藏光标等等 ( c/ `3 I, U. ?% \; N5 K7 \
2. 改变字符颜色的方法,比如
# v+ l1 \ H7 E9 H P! ~$ N echo "<CTRL-V><ESCAPE>[40;32m" 设置背景黑色(40), 字符绿色(32)
# A; q2 Y0 r; J6 n: Y+ v
No.022 屏幕输入1. 输入时进行validation check
: J, A. ~; |7 Y6 N" O8 F; S9 f “送进的是垃圾,出来的肯定是垃圾”
; S U7 x# M' p7 h- J, N+ D8 U, rNo.023 调试脚本1. shell不会对错误进行精确定位,当shell打印错误后,需要观察报错的整个代码段 0 f* n8 W' ~9 K+ R
2. 在脚本中利用set命令辅助调试
5 A/ d8 Y7 @, G8 N$ b set -n 读命令但不执行 / l M0 e \- F! M5 O, I |% R2 F
set -v 显示读取的所有行
4 g \% d9 l, V5 k set -x 显示所有命令及参数
. s4 ?+ p/ T. M7 w/ K - 表示打开; + 表示关闭;set +x 表示关闭显示所有命令及参数
, ~% `, s _9 GNo.024 shell 嵌入命令1. set 命令在脚本中设置脚本的运行参数
: s9 {/ D: N# f7 h: [: E: U2. times命令打印shell消耗时间和运行命令消耗时间 ??? ; P7 i4 `7 g$ U" B& F4 N
3. type 命令查询命令是否有效及命令类型 4 z& S( [! J$ X( q
4. ulimit 命令设置运行在shell上的显示限制 + v$ G5 c* w# O5 v; `" F
5. wait 命令是父进程等待子进程完成
; U2 K/ }7 v' J7 I3 a1 Z5 t3 PNo.025 深入讨论<<1. 创建文本 ex. cat >> file <<end : C7 [* s; ?$ W; _% o6 R
> (输入内容)
9 ~3 B; z q3 C/ F7 U1 d > end 1 r( [/ s) t9 A& Z# e
(输入内容)将被追加到file中
) U k$ ?. @) H' u# e8 q, d: @% jNo.026 shell工具1. 用日期做文件名,ex. $ Myfile=`date +%Y%m%d%H%M%S`
0 s z! |" a% h& C- N" E $ touch $Myfile 6 g. u9 I* I( ~. l" j6 @
2. 脚本中的临时文件名中加入进程号,可以保证文件名唯一,并在脚本结束时删掉文件
5 `; |2 O5 r& N ex. TmpFile1=/tmp/tempfile1.$$ ' [, w/ N4 T+ m, k1 B, F
TmpFile2=/tmp/tempfile2.$$
6 P; X; k; D$ a A rm /tmp/*.$$ + s. W/ S" Q: y1 A$ \0 t8 O
3. 常用信号
% Y! G1 c+ Q | 信号 信号名 含义
. h$ ^+ m" q/ G* n( ^3 H 1 SIGHUP 挂起或父进程被杀死 - L) p2 R2 z$ Y0 ]5 x
2 SIGINT 来自键盘的中断信号,通常是<CTRL-C>
/ {9 B+ i0 X2 a9 f! i1 S3 Z/ Z 3 SIGQUIT 从键盘退出
/ G" b+ L' z# M8 M# v 9 SIGKILL 无条件终止
8 s! q) ~# f4 m/ h; d3 L 11 SIGSEGV 段(内存)冲突 9 {# o9 k$ @$ U0 j
15 SIGTERM 软件终止(缺省杀进程信号) 2 k: @( g% v0 J( c9 b
4. trap 捕获信号 语法 trap "do-something" signal(s) 3 M% Z+ L0 S8 ]% r! h
ex. trap "" 2 3 忽略信号2和信号3,用户不能终止该脚本
& o0 F9 `& E5 W P4 { trap "commands" 2 3 如果捕捉到信号2和信号3,就执行相应的commands # [6 P# r% r( @( S! A) P
trap 2 3 复位信号2和3,用户可以终止该脚本
0 K; Y k! |; ?5. eval 对变量进行2次扫描 比如:
T. h4 L& Q, L( G [wangyb@localhost bash]$ VAR1="cat a.sh" % l. U6 x1 U, o0 A9 r" C' d5 C8 j
[wangyb@localhost bash]$ echo $VAR1
J- v% U& }- ~5 ]0 L% {+ p cat a.sh
3 Y) v0 Y- G, s4 _( ` [wangyb@localhost bash]$ eval echo $VAR1
, f) {( I3 {" H+ Y# u# w6 x6 | cat a.sh `5 t" [' C* R) b p/ q; W
[wangyb@localhost bash]$ eval $VAR1
# z8 p4 |( b0 f9 Y #!/bin/bash
- I V8 h) c' x5 \4 I8 E TMP='HELLO' * V5 k$ d$ ^4 a
sleep 2
N& E3 q, a* S N0 J6 w times 3 t$ `( |0 U0 u6 P# E% F' _
6. 获取命令行的最后一个参数: ex. $(eval echo \$$#)
D5 F" v! I. @+ H2 U0 s, c7. logger 命令记录日志
5 n6 c1 |2 @! ]# [7 T E: y: g5 SNo.027 几个脚本例子# 作者常用的几个脚本
No.028 运行级别脚本1. 确定当前的运行级别:who -r 5 a" F+ ~: {' B$ r& `+ h
2. 运行级别含义 7 ]9 Y2 x" I5 F$ W
运行级别0 启动和停止整个系统 E# c6 L/ B8 ]6 N) j% O
运行级别1 单用户或管理模式
) v6 W Z3 ?1 R' E 运行级别2 多用户模式;部分网络服务被启动。 7 ]' r. h, V) F5 ~
运行级别3 正常操作运行模式,启动所有的网络服务 7 f8 e y& ~% @5 Q! V# ~+ a
运行级别4 用户定义的模式,可以使用该级别来定制所需要运行的服务
7 ^% ]4 i3 i; }% m9 ?: H 运行级别5 有些Unix操作系统变体叫起作为缺省X-windows模式 1 I) v' q9 ?6 R/ G7 ~* A: d
运行级别6 重启动
" o$ _) g% _8 s7 w- F
No.029 cgi脚本# 感觉现在应该不会有人用bash来开发web程序了吧
No.030 常用shell命令1. basename : basename path
9 Y Y" z9 m: x: ]( n2. cat : cat optiones file
' O+ F% ^7 G* W6 c l5 D: F' I -v 显示控制字符
l% Q7 M) p* n- h& s0 ^) v/ I) e3. compress : compress options files
/ L' B0 Q3 a$ \* J -v 显示压缩结果
V1 z! t$ q" F" l$ b/ Y& i4. cp : cp options file1 file2
; s* g2 O2 v( y6 [# A8 C -i 覆盖文件之前提示用户确认
' V/ O, u4 Y1 z5 e6 W; b -p 保留权限模式和更改时间 % O# P8 K# K/ \- T5 b
-r 拷贝相应的目录及其子目录
" k- w( V/ L1 K- L6 x' V6 A5. diff : diff options file1 file2
3 r! M# T) t; Z& K -c 按照标准个数输出
) w8 m) c# `" I -I 忽略大小写
% m. d7 @3 o4 u9 q1 e) W* I5 R6. dircmp : dircmp options directory1 directory2
! ?* k( w, l: u -s 不显示相同的文件
6 [& O: ^- b8 d# @7. dirname : dirname pathname
; N2 I( x O3 i8. du : du options directory ) Z: `# [! [; b; e' \' D
-a 显示每个文件的大小,不仅是整个目录所占用的空间
0 | b1 n, Q! V- e -s 只显示总计
3 W# v: e9 ]& S/ h9 i9. file : file filename 4 D q' I g# }7 h
10. fuser : fuser options file
- ]2 _/ X g4 l/ V" e! L! j% \3 a -k 杀死所有访问该文件或文件系统的进程
7 S2 `$ p- {5 E( {2 p -u 显示访问该文件或文件系统的进程 6 _) O* e1 c, x9 A q3 p3 X
11. head : head -number files # C" @( w- Y! n; Z8 \: H
12. logname : logname (显示当前使用的登陆用户名) 3 s5 @: C& l7 Z4 W* H
13. mkdir : mkdir options directory
5 K8 c- D# d' j0 A" m) v/ | -m 在创建目录时按照该选项的值设置访问权限
7 g/ @4 I3 T# D8 L+ F' g14. more : more options files / z7 E& q; \6 J
-c 不滚屏,而是通过覆盖来换页
% l5 B' H0 T; @* s! K/ X -d 在分页处显示提示 7 M ?& M, _$ x
-n 每屏显示n行 . E, L6 h: H' e" {4 ~8 U3 o0 Y
15. nl : nl options file 2 D5 i4 ^% x3 W
-I 行号每次增加n;缺省为1
6 V- R. S+ ~" X; F8 Q( M7 x8 ? -p 在新的一页不重新计数
0 J8 Q; z5 W" r' P' y# ^% V, X16. printf : printf format arguments % |* r2 e; g( o C+ U0 J( W
17. pwd : pwd ( o, g F3 S' {9 h; {/ h
18. rm : rm options files
- H8 o F2 z: ~8 y3 g( G -i 在删除文件之前给出提示(安全模式) ' Z- a3 l2 T0 V0 `. J! ]
-r 删除目录
( r$ j5 H" J8 y! @19. rmdir : rmdir options directory / L, y% |) p/ i: q
-p 如果相应的目录为空目录,则删除该目录
2 e6 [2 Q9 |, ]( C1 d20. script : script option file
) U9 a8 H: l6 p' Z% k% z -a 将输出附加在文件末尾
M2 y8 D# H: l* C# l) w21. shutdown : shutdown now
5 q) j7 |2 u$ _) _3 z l22. sleep : sleep number(秒数) ' @/ s0 K8 H" ~
23. strings : strings filename (查看二进制文件中的文本)
( J" a! a! p. z4 q/ V. N3 u" Q24. touch : touch options filename
3 I8 J0 Q8 }3 }# j3 M -t MMDDhhmm 创建一个具有相应月,日,时分时间戳的文件 ( z+ l6 H/ ^" n% u4 a
25. tty : tty 显示所连接的设备或终端 8 G# r8 }2 R2 v4 e
26. uname : uname options
2 e5 F8 y- d0 P2 ] {; @7 \ -a 显示所有信息
# C) R! S+ h( W) ~( G2 X1 h -s 系统名 4 r% @% v( a" @
-v 只显示操作系统版本或其发布日期 $ o) { n, V/ T$ R( H5 Y2 d
27. uncompress : uncompress files 3 M+ g# P$ B7 e8 F3 r9 G
28. wait : wait processID - U9 ~3 D( p+ E. M
29. wc : wc options files 5 G5 r% N, Y( c L* n
-c 显示字符数
* c* A$ M5 ~' _& a! W -l 显示行数
% `6 `7 o b1 i7 T; { r. @ -w 显示单词数 , a" w0 x6 d, O/ b& F1 K
30. whereis : whereis command_name " U; u# e2 y7 Z0 `% q' @: U- X
31. who : who options
7 j9 O* U- W* F- c# n3 q -a 显示所有的结果
: x- G0 M% c" Q9 R# n( I -r 显示当前的运行级别
( T$ [. \- V# e! Z( x4 v -s 列出用户名及时间域
9 Q U; I. K- O. q
作者: younicp 时间: 2020-8-28 18:01
Linux shell笔记
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |