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和xargs
1. 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 grep
1. 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