找回密码
 注册
关于网站域名变更的通知
查看: 278|回复: 1
打印 上一主题 下一主题

Linux shell笔记

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-8-28 15:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    由于工作的需要,越来越多的接触到linux系统。最近看了《Linux与Unix Shell》这本书,安装书的章节整理了一些自己认为比较重要的命令,方便以后查阅。
    * c6 h2 o2 L% \
    No.001 文件安全与权限
    1. umask 决定了新建文件的权限 & M3 p' `7 R% A7 p! f
    2. 软链接(符号链接) ln -s source_path target_path
    0 M' {' `* B  k/ P/ F7 A" @6 d
    No.002 find和xargs
    1. find pathname -options [-print -exec -ok] & ?( o3 W+ @! ~+ a/ P; I% N
       其中exec参数的命令格式: 'command-' {} \; 注意必须包含【{} \;】
    ! D% ]5 _& p+ R) l5 i" e   -perm 按权限来查找  ex. find . -perm 755 -print
    - a7 J0 H2 m# |' \% n9 x   -mtime 按修改时间来查找 ex. find / -mtime -5 -print 更改时间5天以内
    8 V4 S+ m' ~: D4 O9 R3 z, @/ [                               find / -mtime +5 -print 更改时间5天以前
    3 `% R7 a6 b0 b- o2 G2. xargs与-exec和-ok类似,但是限制更少,也更快
    , i5 V4 A: C9 ?/ S   3种参数的命令:find . -name "*.c" -exec wc -l {} \;
    7 T' X  [6 `8 o; p5 r' B                        find . -name "*.c" -ok wc -l {} \;   每次执行命令前有提示
    / V) _. R7 A" G' N7 K' o                        find . -name "*.c" | xargs wc -l

    , ?1 z* y! e2 |No.003 后台执行命令
    1. [crontab] [at] [&] [nohup]四种
    2 o! f  Q3 G! ~6 K2 f' x! ?
    No.004 文件名置换
    1. 列出隐藏文件 ex. ls .*
    0 C4 N4 Q7 h/ b, Z: P1 f- g2 V7 N
    No.005 shell输入与输出
    1. echo输出时加上 -n 参数不换行, ex. echo -n "aaaa"
    + `8 b' H# g9 [7 S2 ?2. tee 命令可以同时输出到屏幕和文件中 ex. ls | tee file.out
    9 r  T. i9 c. ]- p+ }3. 标准输入 0  标准输出 1  标准错误 2
    & R0 H8 q1 `/ i- L8 N4. 将标准输出和标准错误输入到一个文件  ex. command >file.out 2>&1
    ; W4 V  m7 F! M0 B
    No.006 命令执行顺序
    1. 命令1 && 命令2    命令1执行成功后才会执行命令2
    ) {: q8 @* Z. s" X. u' g2. 命令1 || 命令2    命令1执行失败后才会执行命令2
    + I( P1 }$ d. j" D$ Q6 g+ V, z) R
    No.007 正则表达式
    1. 正则表达式元字符及含义 - S" t" H1 Q0 E# D' A7 t* ^+ _
        ^                     只匹配行首 6 G1 K9 ]* ^* l$ |# `. |
        $                     只匹配行尾
    " s& S  H2 N, I! j( x1 T    *                     匹配0次或多次   G' r; g0 E* F+ h. h  @
        []                    匹配[]内字符
    ' ~% X2 n; c: S7 a+ n3 ~# l    \                     转义符
    1 o6 T) f5 ~( l) a    .                     匹配任意一个字符
    * p1 I9 E+ o. g0 o6 Q    pattern\{n\}          匹配pattern出现的次数,n次 - \2 W' N# ^7 U. b, d, A
        pattern\{n, \}        同上,最少n次
    * |/ a" X0 y4 F8 H  |) q    pattern\{n, m\}       同上,次数在n与m之间

    , x- G6 }3 F- |6 p2 _% {% VNo.008 grep
    1. grep 主要选项及其含义
    ( ^. z4 c8 \" r- ]1 @1 w2 Y   -c    只输出匹配行的行数 # P* ^* n, R; v" R. d& T
       -i    不区分大小写
    0 R0 t0 m, c% W4 B: C   -h    查询多文件时不显示文件名
    " F$ W' F: d* M2 z   -l    查询多文件时只输出包含匹配字符的文件名
    3 n5 v8 R( o" M   -n    显示匹配行及行号 : y. c6 u( z1 J1 r( Q
       -s    不显示不存在或无匹配文本的错误信息
    7 ~& ?% m+ D  t  _- c   -v    显示不包含匹配文本的所有行 $ S. E  L! C3 f0 A+ t" o
    2. 查询空行 grep '^$' filename " Z6 W9 R- P  j' t
    3. 类名及等价的正则表达式 5 H+ u' s, H! L: E# i3 d
       [[:upper:]]    =    [A-Z]
    $ w6 \" K# z! H! p   [[:lower:]]    =    [a-z] . g& `4 \) ^6 T0 T
       [[:digit:]]    =    [0-9] # T) j2 ~6 C1 I5 r$ Y: h* b
       [[:alnum:]]    =    [0-9a-zA-Z]
    # [( V! Z- b9 h   [[:space:]]    =    空格或tab键 3 j9 h# [; H; l' |0 W
       [[:alpha:]]    =    [a-zA-Z]
    8 h8 B  d$ M) U* g
    No.009 AWK
    # awk的主要作用在于将文本分成各个区域,便于分别进行处理 + R8 O3 R( l/ A+ R" w' X
    1. awk -F指定分隔符,-f指定awk脚本
    - N& ]1 q- }* v) E$ p& x" P: n   ex. awk -F: 'commands' input-file(s) % ~( g! H3 {4 [8 s/ U" ^8 T
       ex. awk -f awk-script input-file(s) / Z/ s( x# u2 X5 m3 w* o; S
    2. awk 分隔出的域用$1,$2...$n来表示,其中$0表示所有域
    2 N7 _' j; m' R$ K  V, K6 U# V' p8 }4 k$ a3. awk 条件操作符 <, <=, >=, ==, != 3 H+ b" I8 N# y5 E! f: h9 x) r. W
       ~  匹配正则表达式   !~  不匹配正则表达式
    8 t- j% U* [. F) r* r% z6 e4. awk 内置变量
    ! w5 @6 N/ i. H/ \   ARGC        命令行参数个数
    ) n) F# `4 C; L% U1 y& j: `   ARGV        命令行参数排列 ! J' @9 c( D; a: ^" J8 _! e. I
       ENVIRON     支持队列中系统环境变量的使用 , n3 B8 ^) u# }8 ]  z" S
       FILENAME    awk浏览的文件名 # h2 [% @6 M* p9 }+ B
       FNR         浏览文件的记录数 3 y/ b+ N# Z2 u% ~" P. h1 V, C
       FS          设置输入域分隔符,等价于命令行-F选项 / n% t$ j0 H$ r  O( M
       NF          记录的域个数 3 d: _2 \& D# g  W
       NR          已读的记录数
    4 b6 h0 u; D* k$ Z   OFS         输出域分隔符
    ( _; ^+ o5 k% z7 r3 P6 C   ORS         输出记录分隔符
    1 U, Q8 A; r/ z, f- x   RS          控制记录分隔符
    * }4 p; s2 G- V. f, e   ex. awk '{print NF,NR,$0} END{print FILENAME}' input-file 1 c- N6 K$ S' Z" t0 s
    5. awk 字符串函数 2 {! L8 a( x6 E" m
       gsub, index, length, match, split, sprint, sub, substr, substr
    # x$ b9 @# K3 i% k. h6. awk 中的printf函数可以控制格式化输出
    $ |8 t' x0 _6 k$ N7. awk 的循环结构 For (element in array) print array[element]
    & |* z5 Q. n6 E8 D2 ?
    No.010 sed
    # sed的主要作用在于过滤和查找文本中的特定内容
    . n: o" o, ?' A6 w+ L! P1. sed 命令格式: sed [options] sed-command input-file   t/ I4 A$ R) S* t0 h  h) l3 X
                      sed [options] -f sed-script input-file
    # m" `( l! g1 r8 z3 Q+ L- q8 m
    No.011 合并和分隔文件
    1. sort, uniq, join, cut, paste, split
    ; O  B- O$ I8 M/ |7 X8 f
    No.012 tr的用法
    1. 去除oops.txt中的重复字符 tr -s "[a-z]" < oops.txt ( W3 f( H7 {; {% c- F, q
    2. 去除oops.txt中的空行 tr -s "[\n]" < oops.txt
      A, z1 Q3 y  d$ m3. oops.txt中小写转大写 tr -s "[a-z]" "[A-Z]" < oops.txt
    & P  h. D  ~. t  Y9 T2 Q# @
    No.013 登录环境
    1. /etc/passwd 保存所有账号的基本信息(不包括密码) 4 c% h" M( t: m7 C: O; z1 o
    2. /etc/profile 基本的配置信息,登录时读取此文件
    5 v2 k7 \0 D0 |  b  R- F7 X3. $HOME/*profile 各个用户的profile文件,会覆盖系统的profile文件
    7 ~, g8 c+ E9 ]: L9 o7 P# u4. $HOME/*logout logout(键入命令exit时)是执行的脚本
    & p6 D) J* x" o# z# `0 V
    No.014 环境和shell变量
    1. shell变量的设置方式 1 A6 c$ t  u, p& Y& `0 J7 V7 }2 C3 x
       Variable-name=value    设置实际值到variable-name
    6 f/ ?! c. W; l+ h7 c; n6 `   Variable-name+value    如果设置了variable-name,则重设其值
    1 e8 e3 r& x3 h5 @0 i% ]% {& L( P+ A   Variable-name:?value   如果未设置variable-name,显示未定义用户错误信息
    9 F7 X/ l8 q7 O1 A/ t4 g   Variable-name?value    如果未设置variable-name,显示系统错误信息
    # H- d/ O/ |* g3 ^' ^/ M( q   Variable-name:=value   如果未设置variable-name,设置其值 * Y# [9 p; {$ I; a
       Variable-name:-value   如果未设置variable-name,就用value,但是不设置variable-name 9 Q. Q8 A0 K( c, M
    2. 设置只读变量  readonly variable-name   U& h4 ~. R& m3 @( n( g! x
    3. export variable-name 可以将变量导入到子shell中 ) Y4 l2 r& f. u7 z8 Z/ M7 K4 [
    4. shell脚本的参数 $0表示脚本名字,$1表示第一个参数......$9表示第九个参数 $ Q  y- P$ c0 S5 V
    5. 特定shell变量 , D* v* P, B( [( Z
       $#    参数个数 * |/ w- D. g8 g( Z5 b! l( C) \
       $*    用一个字符串显示所有参数 " D3 m7 [: ]& n- c2 I4 T! {  K
       $$    脚本运行的当前进程ID
    1 i  m5 Z0 w/ }2 E  d$ v   $!    后台运行的最后一个进程的进程ID / a6 |1 \) G8 Y7 e7 C$ O" f7 s  h" |) {( h
       $@    与$*相同,每个参数作为独立的字符串
    / W* {% [5 @$ Z* k, l   $-    显示shell的当前选项,与set命令相同 ( S/ v. R/ \; ~7 g& H: ?
       $?    显示shell命令的退出状态,0表示无错误,其他表示有错
      y2 l5 ~2 ?6 S+ @! A
    No.015 引号
    1. 双引号("") 其中引用的变量会替换为变量值。比如:
    # h! N- l) P5 K9 j    [wangyb@localhost bash]$ STR="Hello world" 1 _- h; q! ^. f# J/ r: j
        [wangyb@localhost bash]$ echo "$STR" " D: J- S. E6 @
        Hello world
    - l- m0 ]- q! s6 z2. 单引号('') 忽略变量和其他特殊字符,单引号内任何内容都当成字符串显示。比如: & S: m/ ?8 p7 Z) x. K9 l
        [wangyb@localhost bash]$ STR="Hello world"
    5 Z# _3 K- {0 o; f2 y  n+ {' Z! M, {" S    [wangyb@localhost bash]$ echo '$STR'      ! S6 O7 f+ |3 `! b1 a
        $STR
    * a" P/ ^9 `0 n9 Y3. 单引号和双引号同时使用时,谁在外面谁起作用。比如
    2 M1 I5 S; E9 H- L0 |; e6 @( J    [wangyb@localhost bash]$ echo "'$STR'"
    . |: n! l; l$ K1 n& N1 ^- i* z    'Hello world' 3 Q3 R' i; b5 O
        [wangyb@localhost bash]$ echo '"$STR"'
    3 U' V7 Q  a, M6 d* a, d, Z    "$STR" * d' x& i8 E+ _( l
    4. 反引号(``) 反引号中的内容被当做命令来执行。比如 ; E, k& G" Y2 a; R
        [wangyb@localhost bash]$ VAR=`date` ) |8 k# j, d5 F  D0 y( E
        [wangyb@localhos bash]$ echo $VAR
    : a4 m, P$ R+ t+ f    Thu Dec 22 22:08:07 JST 2011 7 s; Y# W+ C! a6 H
    5. 转义符(\)

    6 s0 |( s2 L, ?3 j* @+ gNo.016 Shell脚本介绍
    1. 脚本的第一行一般以  #!/bin/bash  开始
    9 S3 Z: {) ], U8 s2. 给脚本加入执行权限后就可以运行脚本了
    . v' \' K/ D" O" B2 T8 W
    #No.017 条件测试
    1. 测试语法  test condition 或者 [ condition ] 使用方括号是注意在condition两边加上空格 , C" U0 X" y7 t- k$ x: n$ ~. R
    2. 文件状态测试 1 s% X  M9 c% e- |7 G# ], }
       -d    目录            -s    文件长度大于0 . z; P1 l, F8 C
       -f    正规文件        -w    可写 + v+ i# U8 Q2 P% f
       -L    符号连接        -u    文件有suid位设置 , s) k  r4 a7 \# m( t
       -r    可读            -x    可执行 + A2 L4 [9 A4 I9 h5 M# [/ C# ?
       例子如下:测试是否为目录,也可以用 test -d bash.sh 来代替方括号
    & [1 }: h- q7 Z    [root@localhost bash]# [ -d bash.sh ]
      S6 T4 s  B1 V0 h- l8 S2 K    [root@localhost bash]# echo $? + Z1 a9 c( D6 f/ R: ^7 O2 h
        1 / M  P" Q  [& O/ o
        [root@localhost bash]# [ -d . ]      
    3 V) H, B4 g+ i! L" l    [root@localhost bash]# echo $?
      X, w$ Z+ B9 C/ L. H    0
    - T! v( i; S8 o/ o7 L3. 逻辑与 -a  逻辑或 -o  逻辑否 ! 例子如下:
    + o4 l! T# R$ F, V    [root@localhost bash]# [ -d bash.sh -a -d . ] 3 a: Q" @$ M( V1 {! _
        [root@localhost bash]# echo $?
    * Z- f! w$ Y0 u) q+ d8 q! f2 ^' [9 ~    1
    ; c4 S4 F: D/ r3 q    [root@localhost bash]# [ -d bash.sh -o -d . ]  " [( ?7 x+ k3 ~+ }2 D& f
        [root@localhost bash]# echo $? - r4 U! `6 U2 }. K: y
        0 5 F" h1 Q) B1 \* r- s- O/ F
        [root@localhost bash]# [ ! -d bash.sh -a -d . ]    - D1 M1 b3 ]; `' T0 A$ x# _
        [root@localhost bash]# echo $?
    , g; Y2 h# [3 \! O8 C$ [5 [$ n    0
    3 H! v. M( {2 ]1 f$ _. f9 i    [root@localhost bash]# [ ! -d bash.sh -a ! -d . ]
    . c; h2 Z2 ^' j0 [' f    [root@localhost bash]# echo $? 4 I3 J! h  y. T8 P$ V
        1 ) {1 V# }& k: O8 ]7 X
    4. 字符串测试  [ string1 string_operator string2 ] 或者 [ string_operator string ] : E5 r0 `  |" S
       string_operator可为:=      两个字符串相等 , v9 N4 J0 z. }; ~! v9 \
                            !=     两个字符串不等
    4 Q, o1 M: p5 k7 u5 K* [5 n- J                        -z     空串
    / t) p8 p1 D1 E7 A3 |+ N                        -n     非空串 2 F* G+ }' ~$ {
    5. 数值测试  [ "number1" num_operator "number2" ] " }- t2 F: g. C' ]# A' u
       num_operator可为:  -eq     数值相等
    8 {. d  N: l; i& L3 O  N                       -ne     数值不等 & c. ?6 U6 ]: P( Z* ^& S# l
                           -gt     number1 > number2
    & E# s2 H2 {# p3 B- ]                       -lt     number1 < number2   D+ P% Z/ y7 H- m7 T, W6 M% X
                           -le     number1 <= number2 ( _9 r, |9 g/ V5 D
                           -ge     number1 >= number2
    , `3 F' `9 S9 `: O' ~   例子:   [root@localhost bash]# [ "100" -gt "101" ] % }) y  F  g* @8 p6 `5 P& c" C
                [root@localhost bash]# echo $? $ v. i# W1 M, ~* \# o" b
                1
    ; D1 ?6 }8 x: L$ o  p; v/ t            [root@localhost bash]# [ "100" -lt "101" ]
    7 d7 |4 W* w* y7 u0 k, X8 [            [root@localhost bash]# echo $?            
    1 c% b$ \( V* s! H' M            0
    7 p6 d: t, A9 `1 E6 y; P, d6. expr语法  expr arg1 operator arg2 8 ?4 J9 K3 J, _
       例子:变量自增
    # k: `% L/ r5 I+ ?% {% b! j            [root@localhost bash]# COUNT=1        " o) d1 Y/ x6 Y( g
                [root@localhost bash]# echo $COUNT    3 l, a7 T5 O  A+ R0 Q  `: `9 k
                1 7 S) ~' B, k" c# l
                [root@localhost bash]# COUNT=`expr $COUNT + 1`
    0 \1 @* m; M0 t7 L/ R            [root@localhost bash]# echo $COUNT            
    6 Z& f1 B4 v- W' D( H& q6 f; g            2

    5 U' o7 l7 x0 B0 ?# n8 uNo.018 控制流结构
    1. if语句格式
    & \% N. c7 Q: c# n; O   if 条件1
    : d" w; F& b& B0 I4 H   then / ~( b: w) L( z; l; W
            执行命令1 % r# H' r. B" Q, i
       elif 条件2
    : ]* Q# z: M  l' P   then
    / D" H; a5 k7 k! ^& ^& {7 j; _        执行命令2 7 }! K" g, E; h: \; h; b6 r) F7 X
       else
    ' e4 `# Y* S& A! f, B: Y        执行命令3
    * g! Q' Z. ^0 |) v% \   fi 9 h: a& l- t) E3 ^
    2. case语句格式 5 a; D3 p* U+ S4 F2 j
       case 值 in * ^  t( N9 B, T! U2 j
       模式1) # k' V& @) S8 O) E' E2 Y( s7 L& _
           命令1
    1 K1 i0 \+ ]- V! L0 N       ;;
    9 m( Z8 D  H! ]) Y: A   模式2)
    * e! F" y) m8 |9 L" a       命令2
    " d' R, w* p& H% ?" d9 b       ;;
    9 O2 X% y- ~9 l% i   ...... * }& u- @9 L% M, u# H1 \/ @' U) ?
       easc ' z) H7 B" e8 s, n. F' T
    其中的“模式”可以是 *(任意字符), ?(任意单字符), [..](范围内任意字符)
    ' M6 R' w* t2 u“模式”中还可以是使用 | (比如 str1|str2 表示str1和str2都可以)
    . K& N& m2 f5 @9 {, v3. for语句格式
    6 _% P+ ~: I* g3 a   for 变量名 in 列表 : K% G9 K7 _" G" Z
       do
    : ~" T/ J: z+ c/ R3 x       命令1 5 p( B, l! [& i# {& D
           命令2 ...... 0 w" s  b$ I5 w, z+ e
       done
    - c- L" A5 I' f0 h4 t4. until语句格式
    : I" p$ t6 s0 ^. b( h2 t   until 条件
    ) ]& D9 {" W8 I! g1 T& p         命令1 & B+ ?+ J$ M" R1 X' L
             ...... . b5 a5 Y5 n: ^* o# z
       done % A, B2 q( D; z1 Y
    一直执行至条件为真时才结束,至少执行一次
    4 Z% v8 \, {9 Q' x5. while语句格式 $ X+ J( A5 F3 H( {3 e! B% p7 o
       while 条件
    3 A% m9 x& @/ `8 t- Z  k         命令1
    ' a2 l4 @7 J  P2 o; h         ......
    ! Q. G7 Q* ]; ^( A& w1 s" y- J& r   done " v1 k* p0 x3 ?8 ]7 |7 p
    6. 利用IFS来改变读取内容的分隔符
    0 r8 X, ?" x0 R  N$ e" \& Q/ x7. 利用break和continue控制循环的执行
    1 ?! W- w9 T" w
    No.019 Shell函数
    1. shell函数格式 9 E% Q/ B/ B" b, }. l
       函数名 ()
    0 p' s% N+ x' A7 F0 M4 l5 w   {
    3 [: q# S& u2 i7 \& B       命令1
    7 E1 t" a  o* ^* }       ......
    - \9 q8 s2 ]0 `   } . }" p: p& u4 H8 c9 V5 b3 i
    或者 8 V% x) b! R; Y8 \! D- `  f9 [3 Q; z
       function 函数名 ()
    4 z7 m1 b5 C6 I   { 3 P% X2 A9 D+ s2 }" E" K/ ?
           命令1 8 X: F- C; H# V
           ......
    ' _: ]' M3 b* b5 J% t7 O8 M   } 3 t! w$ Z: w( ^. T5 j  s# z: m$ L
    2. 引用其他脚本中函数  . /pathname/funcfile (<点><空格><斜线><文件完整路径名>或者<点><空格><文件相对路径名>)
    - O( Q' ~4 e% Z- q3 o* B* ~* F& b3. 函数中通过 $1, $2,......$9来获取参数

    . f/ l9 I, M* d, g4 D% K- p2 B+ V7 A' XNo.020 向脚本传递参数
    1. 使用shift依次获取各个参数,比如
    : D% n2 e# n, [7 d2 e   while [ $# -ne 0 ]
    . ]4 f% g( j1 g* i1 |7 n" r   do 4 Z  x4 [( T6 }/ F6 d- g
             echo $1  # 通过shift,$1将依次表示各个参数
    5 P& X' {! v# W7 w) k$ J' x         shift $ o3 o& l0 M+ @6 |/ e
       done ; k6 X2 m" L% [# [# N) V
    2. getopts语法格式 getopts operation-string variable。
    # ~; F9 L8 f1 e1 v
    No.021 屏幕输出
    1. tput 控制屏幕上的字符输出,比如加粗字符,隐藏光标等等 $ l2 H8 l4 |9 f' p+ F3 x1 d
    2. 改变字符颜色的方法,比如 , `% l3 m: U0 {; o/ `1 a0 f
       echo "<CTRL-V><ESCAPE>[40;32m"   设置背景黑色(40), 字符绿色(32)
    1 g# u3 N% V- t0 F
    No.022 屏幕输入
    1. 输入时进行validation check 8 k: v1 A) T: c) D7 o' M8 b
       “送进的是垃圾,出来的肯定是垃圾”

    , H6 |/ `/ {0 W6 k5 x& y- l2 H5 vNo.023 调试脚本
    1. shell不会对错误进行精确定位,当shell打印错误后,需要观察报错的整个代码段 # S3 [, E8 x  b( |
    2. 在脚本中利用set命令辅助调试 ( N+ K8 h0 `8 D3 \: ?; ^8 }- v
       set -n    读命令但不执行
    9 Q. V% ~, S& [& \- Y% y   set -v    显示读取的所有行 * v% ]/ k3 E/ W( c  O* c% V" A
       set -x    显示所有命令及参数 0 W+ h$ f3 |7 [0 E( e
       - 表示打开; + 表示关闭;set +x 表示关闭显示所有命令及参数
    0 U; F+ P4 U$ G: B5 z6 [
    No.024 shell 嵌入命令
    1. set 命令在脚本中设置脚本的运行参数
    - n. C, u# v  ~' G0 R; d4 s$ q2. times命令打印shell消耗时间和运行命令消耗时间 ???
    * `$ ]+ l; M( Q! K$ I3 A3. type 命令查询命令是否有效及命令类型
    ' A5 F6 f( @: ~3 T1 ]4. ulimit 命令设置运行在shell上的显示限制
    7 I2 ?7 o! v- }! Q( v& ]# M+ Y. p5. wait 命令是父进程等待子进程完成
    & h1 B( T0 d/ F% I3 e; ^6 L8 I
    No.025 深入讨论<<
    1. 创建文本  ex. cat >> file <<end
    " t% U" F7 q0 i0 |, |+ r                 > (输入内容) - T( A& R1 R3 @1 G2 P. I9 B$ U
                     > end
    9 U# N' m% L2 N! D- L9 ^* e   (输入内容)将被追加到file中
    & p; A2 F& w/ W
    No.026 shell工具
    1. 用日期做文件名,ex.  $ Myfile=`date +%Y%m%d%H%M%S`
    1 H, D9 f1 ^, X- t  v, M                        $ touch $Myfile
    4 H' E7 a* i- `2. 脚本中的临时文件名中加入进程号,可以保证文件名唯一,并在脚本结束时删掉文件
    $ X( M9 u6 W1 Z   ex. TmpFile1=/tmp/tempfile1.$$ 6 E" k" W( m$ A; h4 Z/ }8 M6 p
           TmpFile2=/tmp/tempfile2.$$   h3 k% W5 _0 y4 F# C0 t/ p
           rm /tmp/*.$$
    8 P( w, n, r( J3 D( u8 A  f. L3. 常用信号 : p+ Q2 K, T/ T% u2 i
       信号    信号名        含义
      G* Z; J' k. t   1       SIGHUP        挂起或父进程被杀死 4 d% w1 n" F& z: y
       2       SIGINT        来自键盘的中断信号,通常是<CTRL-C> , k! c4 p, v6 [7 z2 M7 ~
       3       SIGQUIT       从键盘退出
    " `, V2 N7 f) c# ^$ m6 ]   9       SIGKILL       无条件终止 - y! w. G' q5 H2 o9 s7 r) {
       11      SIGSEGV       段(内存)冲突 ; Z4 c1 S7 v) w% e7 i3 Z3 C
       15      SIGTERM       软件终止(缺省杀进程信号) / b1 a& v8 v8 f1 S. I$ `$ V; b
    4. trap 捕获信号 语法 trap "do-something" signal(s) / i* N' X! _7 j. d* z) N( x0 W2 T- L$ c
       ex.  trap "" 2 3           忽略信号2和信号3,用户不能终止该脚本 / }+ d4 a- D4 \" D4 i" b
            trap "commands" 2 3   如果捕捉到信号2和信号3,就执行相应的commands - V+ h8 v' O2 Q7 \2 w
            trap 2 3              复位信号2和3,用户可以终止该脚本 $ Q+ J, h0 m, `4 o0 n
    5. eval 对变量进行2次扫描 比如:
    ; S8 s' Y/ v: G, k6 b        [wangyb@localhost bash]$ VAR1="cat a.sh" % t  e; T( B/ p8 r1 L8 a
            [wangyb@localhost bash]$ echo $VAR1 6 U/ Z, x4 Z$ k4 [6 q
            cat a.sh % m, j7 t  o' ?5 L% `- N
            [wangyb@localhost bash]$ eval echo $VAR1  5 x! `* ^  c( Z5 y6 P! j7 M! ]' ~
            cat a.sh
    $ Y3 |/ ~. C3 B" j0 @        [wangyb@localhost bash]$ eval $VAR1     9 x3 L2 U2 q* p4 K  L$ v
            #!/bin/bash
    8 N( |/ ]6 _8 c/ h5 H' K: Z7 M- }7 H        TMP='HELLO'
    ( \5 O3 M) I( c: {        sleep 2 0 Q% f( v! x7 e+ `$ K
            times
    8 \2 E' }: c% b' Q6. 获取命令行的最后一个参数: ex. $(eval echo \$$#)
    # C8 ^9 X8 |6 a, q7. logger 命令记录日志

    2 K" ~+ ?& b+ `( z; h! Q( s* ]: nNo.027 几个脚本例子
    # 作者常用的几个脚本
    No.028 运行级别脚本
    1. 确定当前的运行级别:who -r
    ' U- _0 u7 G! C& }) [7 `# s& D2. 运行级别含义
    ( X* y; ]. N! G* V* x   运行级别0    启动和停止整个系统
    2 g0 y; K  g( Z   运行级别1    单用户或管理模式 % B+ a' \# F5 J/ g
       运行级别2    多用户模式;部分网络服务被启动。
    ; I8 F: h' |; k* n2 m" F/ R   运行级别3    正常操作运行模式,启动所有的网络服务
    ; K( G2 T% P6 k8 P8 |: P/ d   运行级别4    用户定义的模式,可以使用该级别来定制所需要运行的服务
    & S0 d* z* J& o1 T$ ^/ i; |# t& z   运行级别5    有些Unix操作系统变体叫起作为缺省X-windows模式 " ~  O, ~0 I7 M7 `6 v' i. I& _  D
       运行级别6    重启动

    7 }% ~. _+ r" I% N  RNo.029 cgi脚本
    # 感觉现在应该不会有人用bash来开发web程序了吧
    No.030 常用shell命令
    1. basename : basename path   f) H3 n* Q* Z
    2. cat : cat optiones file
    , \7 P* x# _+ k0 r3 W1 v$ C$ ^       -v 显示控制字符 + [. M: z# I2 }# x; f
    3. compress : compress options files
    " R  r+ l5 M3 T. I       -v 显示压缩结果 - \7 d# |3 g- {. Z) g
    4. cp : cp options file1 file2 ( e6 W- G* ]* Z' ^
           -i 覆盖文件之前提示用户确认
    7 h* y$ t, F  D) P( ?) P) ~# p       -p 保留权限模式和更改时间
    5 D7 u, Q7 V9 h+ z; R! H2 S% Q) U       -r 拷贝相应的目录及其子目录
      Y! r2 q$ L9 I5. diff : diff options file1 file2
    # i6 K+ a/ V2 O9 c" \$ [2 k& [       -c 按照标准个数输出 # ?5 s/ Y' D, P
           -I 忽略大小写 7 ~) v* \' t+ I, I
    6. dircmp : dircmp options directory1 directory2
      P+ E+ n, ?- T) T" c! u       -s 不显示相同的文件 9 r0 R' O, A3 @. l3 P1 Q3 S
    7. dirname : dirname pathname 1 {- K5 K: f2 @' f' |* x' o! O( N% ?
    8. du : du options directory 1 ~, G0 G/ _  l7 V, k0 {
           -a 显示每个文件的大小,不仅是整个目录所占用的空间
    3 z4 p! c* F/ }8 h2 y$ r       -s 只显示总计 + u" K' m9 |/ J: c. X
    9. file : file filename
    - |$ P* j% F. Y0 S: E0 P& c10. fuser : fuser options file
    1 X5 z# {. S1 S& t# G4 _' X       -k 杀死所有访问该文件或文件系统的进程
    1 ~& @. d1 R1 ?6 y' C       -u 显示访问该文件或文件系统的进程
    ( ?3 k3 H' w7 N9 `& m11. head : head -number files ' S: l2 U6 [' S. k3 J1 a# g0 F* A
    12. logname : logname (显示当前使用的登陆用户名)
    - k: @6 S3 i; a& r13. mkdir : mkdir options directory * x" G" t3 M! s$ h0 K; S8 `* K0 P
            -m 在创建目录时按照该选项的值设置访问权限   _( H7 V, J5 G7 V' p6 `
    14. more : more options files
    ! O. m" R: R( J6 X# ^# ~* B        -c 不滚屏,而是通过覆盖来换页
    5 r! }3 v- C. F0 _9 [- `        -d 在分页处显示提示 1 i# j+ y$ J. ?" U
            -n 每屏显示n行 / {3 O3 e. R3 }. H- [
    15. nl : nl options file
    * Q( V$ L) ?1 E9 D7 r* `' W        -I 行号每次增加n;缺省为1 ) v2 H1 m9 {: M: B
            -p 在新的一页不重新计数
    / q' s: p4 }4 z( {" }16. printf : printf format arguments
    6 d! |5 C$ x% V) x% Z# @17. pwd : pwd
    - u6 u7 j. u  U6 z9 ?2 q2 h18. rm : rm options files
    3 d+ e+ T. j* K! c+ J. f* b        -i 在删除文件之前给出提示(安全模式) 8 Z' |9 x$ x# U; H$ }# _% |* L7 E$ z
            -r 删除目录 . t- W: l' f, `& t, A
    19. rmdir : rmdir options directory
    ; U; b3 W6 [/ C; D9 K1 m& v1 U( }, `        -p 如果相应的目录为空目录,则删除该目录
    ; U" h. K# P! Y0 C) J/ p6 k20. script : script option file " S% r) E5 ~# x, Q/ J
            -a 将输出附加在文件末尾
    ; W, V0 U# K, `$ ]21. shutdown : shutdown now ; G# W6 z  n+ Z2 C% i- s
    22. sleep : sleep number(秒数)
    " w7 w+ k# o+ k: g23. strings : strings filename (查看二进制文件中的文本) 4 h5 e. }. E0 A$ W
    24. touch : touch options filename 3 ~% a5 f3 g  F, O
            -t MMDDhhmm 创建一个具有相应月,日,时分时间戳的文件 8 ?& _7 X0 A: M  K8 h. n
    25. tty : tty 显示所连接的设备或终端 3 f. S* J% C0 N3 ?8 l  J# C
    26. uname : uname options
    . L* |( ^; x9 ~. _, x        -a 显示所有信息 / z# U$ Y+ ^% e# d# }3 k
            -s 系统名
    . a2 o0 ]5 S7 n9 x; q2 d3 g" ~        -v 只显示操作系统版本或其发布日期 - U- e8 _) H/ `6 n
    27. uncompress : uncompress files
    8 Y0 ~( ?  k/ Z7 i28. wait : wait processID & |, N, L, O( h5 S+ {7 [4 u
    29. wc : wc options files 6 p3 n4 C+ A' a8 S) h) Y
            -c 显示字符数
    , h3 c% c5 ^# |" M( ]        -l 显示行数
    9 |, L9 t# Q4 U% _1 y9 Y& g        -w 显示单词数
    . Q1 x8 y7 Q! I1 _( u30. whereis : whereis command_name
    ; G  W  p$ K2 M7 {& {31. who : who options ) ?8 H6 z8 S( T$ O# W, F, v
            -a 显示所有的结果
    7 N4 }; y) v5 L  a2 _        -r 显示当前的运行级别
    $ \! O, T. q7 d, w& ]0 H0 K3 ~4 t$ H        -s 列出用户名及时间域

    " f: A; S! I. ]7 |
  • TA的每日心情
    慵懒
    2020-6-13 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-8-28 18:01 | 只看该作者
    Linux shell笔记
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 02:04 , Processed in 0.187500 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表