Shell学习笔记

Shell脚本的优点主要体现在:

  1. 可以无缝的执行命令
  2. grep,awk,sed在字符串处理上编码量非常少
  3. 管道+shell控制流+shell变量,让文件操作编码量非常少

 

grep,sed,awk的差别和联系

  1. grep:抽取出满足某些正则表达式的
    例如:grep ^[0-9] $x 
    #找到以数字开头的行
     
  2. sed:对满足某些正则表达式的进行置换,添加 
    例如:sed s/,/' '/ > ${x/Pos_/PosLine_}
    #把','替换为' '。输出重定向到文件名为$x变量中替换‘Pos_’为‘PosLine_’ 
     
  3. awk:处理,对统一格式的行有奇效,已经发展成自身一套语言 
    例如:awk -F[adc] '{print $2}'
    #打印以'a','d','c'为分割,的第二列 

 

码量是不是很少?

最终用于我的实验的脚本(递归遍历文件,对相应文件执行操作):

 

 

#!/bin/bash

myfunc()

{

        for x in $(ls)

        do

                if [ -f "$x" ];then

                        if [[ $x == faultPos_*.txt ]];then

                                echo "$x";

                                grep ^[0-9] $x | awk -F[adc] '{print $2}' | sed s/,/' '/ > PosLine

                fi

                elif [ -L "$x" ];then

                        echo "this is a link";

                else

                        cd "$x";

                        myfunc;

                        cd ..

                fi

        done

}

 

myfunc

 

 

 

 

 

 

==========以下是叨叨念===========

 

 

学习资料

  1. 《shell十三问》
  2.  manual
  3.  找实例源代码查看(我看的是TC的一个运营脚本库)

 

  1. awk与sed的区别?
    1. 我觉着,如果是按行操作,就统统都用 sed
    2. 如果是不仅按行,还要按列操作,就统统都用 awk
    3. 还是学习sed
  2. QUOTE: 若從技術細節來看,
    1. shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
    2.  然後再針對特殊字符(meta)先作處理,(例如变量替换)
    3. 最後再重組整行 command line 。
  3. 花括号的作用
    1. 此外,我們也可利用命令行的變量替換能力來"擴充"(append)變量值: 
      1. A=BCD 
      2. A=$AE 
      3. 因為第二次是將 A 的值繼承 $AE 的提換結果,而非 $A 再加 E ﹗
      4. A=BCD
      5.  A=${A}E
      6. 我們使用 {} 將變量名稱的範圍給明確定義出來,
  4. 当一个subprocess执行shell命令的时候,什么东西被继承呢?
    1. 所有
  5. 每一条shell脚本语句都会产生一个subprocess么?还是整个shell脚本产生一个subprocess?
  6. source和sh有什么不同呢?
    1. * 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
  7. exec和sh有什么不同呢?
    1. exec是用程序替换掉当前的shell,相当于原来的shell完全kill了
  8. ()与{}有什么区别?
    1. ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
      1. 注意()中的内容肯定会被执行
    2. { } 則是在同一個 shell 內完成,也稱為 non-named command group。
  9. shell中的function是什么?与其他语言的function有什么区别?
    1. 所謂的 function ,就是用一個名字去命名一個  command group ,然後再調用這個名字去執行 command group 
    2. 与传统的function的区别是,仅仅是用 command group 去替换函数名
  10. shell脚本的参数传递:
    1. script_name parameter1 parameter2 parameter3 ...
  11. 那么shell函数的参数传递是怎样的呢?positional parameter
    1. 舉例而言:
    2. 假設 my.sh 裡有一個 fucntion 叫 my_fun , 
    3. 若在 script 中跑 my_fun fp1 fp2 fp3 ,
    4. 那麼,function 內的 $0 仍然是 my.sh ,而 $1 則是 fp1 而非 p1 了...
  12. 注意$10只是$1+‘0’
    1. 想用第十个参数:
      1. 方法一是使用我們上一章介紹的 ${ } ,也就是用 ${10} 即可。
      2. 方法二,就是 shift 了。shift 掉多少個參數,才可用 $1 取得 ${10} 呢
        1. shift 9
  13. 怎样知道参数个数呢?
    1. $#
  14. $@ 與 $* 
    1. command line 上跑 my.sh p1 "p2 p3" p4 的話
      1. "$@" 則可得到 "p1" "p2 p3" "p4" 這三個不同的詞段(word)﹔
      2. "$*" 則可得到 "p1 p2 p3 p4" 這一整串單一的詞段。
  15.  $(( )) 與 $( ) 還有${ } 有什么区别? 
  16. $()是用来做什么的?
  17. $( ) 與 ` ` (反引號) 都是用來做命令替換用(command substitution)的
  18. shell的数组
    1. A=(a b c def) 
    2. echo ${A[@]} 或 ${A[*]};全部数组
    3. echo ${A[0]} ; 第0个元素
  19. $(( )) 的用处是什么?
    1. 用来做正数运算的
      1. + - * / :分別為 "加、減、乘、除"。
      2. % :餘數運算
      3. & | ^ !:分別為 "AND、OR、XOR、NOT" 運算。
    2. 注意在 $(( )) 中的變量名稱,可於其前面加 $ 符號來替換,也可以不用,如:
      $(( $a + $b * $c)) 也可得到 19 的結果
  20. 有没有函数的返回值呢?
    1. * 若在 script 裡,用 exit RV 來指定其值,若沒指定,在結束時以最後一道命令之 RV 為值。
    2. * 若在 function 裡,則用 return RV 來代替 exit RV 即可
  21. $?是什么?
    1. $?是最近的一个返回值
    2. 举个例子:

      $ touch my.file

      $ ls my.file

      $ echo $?        # first echo

      0

      $ ls no.file

      ls: no.file: No such file or directory

      $ echo $?        # second echo

      1

      $ echo $?        # third echo

      0

  22. test命令是用来什么的?
    1. 有一個命令卻是"專門"用來測試某一條件而送出 return value 以供 true 或 false 的判斷,
      它就是 test 命令了﹗
    2. test有两种格式
      1. test expressiong
      2. [ expression ] (注意[ ] 之間的空白鍵)
    3. bash 的 test 目前支援的測試對像只有三種:
      * string:字串,也就是純文字。
      * integer:整數( 0 或正整數,不含負數或小數點)。
      * file:文件。
  23. test具体使用的例子?
    1. 以 A=123 這個變量為例:
      * [ "$A" = 123 ]:是字串的測試,以測試 $A 是否為 1、2、3 這三個連續的"文字"。
      * [ "$A" -eq 123 ]:是整數的測試,以測試 $A 是否等於"一百二十三"。
      * [ -e "$A" ]:是關於文件的測試,以測試 123 這份"文件"是否存在。
       
  24. 多重复合测试
    1. * expression1 -a expression2 :當兩個 exrepssion 都為 true ,才送出 0 ,否則送出非 0 。
      * expression1 
      -o expression2 :只需其中一個 exrepssion 為 true ,就送出 0 ,只有兩者都為 false 才送出非 0 。
    2. 举例:[ -d "$file" -a -x "$file" ]
      表示當 $file 是一個目錄、且同時具有 x 權限時,test 才會為 true 。
  25. 逻辑组合command line
    1. && 與 || 都是用來"組建"多個 command line 用的:
      1. * command1 && command2 :其意思是 command2 只有在 RV 為 0 (true) 的條件下執行。
      2. * command1 || command2 :其意思是 command2 只有在 RV 為非 0 (false) 的條件下執行。
    2. 举例
      1. $ A=123

        $ [ -n "$A" ] && echo "yes! it's ture."

        yes! it's ture.

        $ unset A

        $ [ -n "$A" ] && echo "yes! it's ture."

        $ [ -n "$A" ] || echo "no, it's NOT ture."

        no, it's NOT ture.

 

 



 

posted @ 2010-07-20 22:57  贺韬  阅读(503)  评论(0)    收藏  举报