《Shell編程從入門到精通》張昊-chap1-8

緣起

  • 20190314開始複習及學習吧;
  • 張昊編著;

內容

  • 目錄 i(9/314)python

    • 全書11章

chap1 第1個Shell程序 1(13/334)

1.一、第一道菜

  • [echo.sh]linux

    • #!/bin/sh
      cd /tmp
      echo "hello world!"
  • (1)每一行代碼是啥意思;(2)如何運行程序?

1.二、如何運行程序

  • 1.2.1 選婿:位於第一行的#!正則表達式

    • 匹配解釋器。
    • 解釋器路徑能夠用whereis bash查。
    • 自刪除腳本shell

      • #!/bin/rm
        # 運行這個腳本時,什麼也不會發生,只是刪自已
        WHATEVER=65
        echo "This line will never print!"
        exit $WHATEVER  #腳本不會在這退出
  • 1.2.2 找茬:程序執行的差別編程

    • source echo.sh時,改變了目錄。
  • 1.2.3 shell的命令種類vim

    • (1)內建命令
    • (2)shell函數
    • (3)外部命令
    • 要知道source執行的差別,不會建立子進程,直接在父進程中執行。

1.三、Linux Shell的變量

  • 1.3.一、變量數組

    • 測試全局變量和局部變量的適用範圍安全

      • #!/bin/sh
        num=123
        func1()
        {
            num=321
            echo $num
        }
        Func2()
        {
            local num=456  #局部變量
            echo $num
        }
        echo $num
        func1
        echo $num
        func2
        echo $num
  • 1.3.二、用echo輸出變量bash

    • echo 掌握各類轉義字符
  • 1.3.三、環境變量的相關操做編輯器

    • export命令
    • bash的啓動文件/登出文件

      • /etc/profile
      • /etc/bashrc
      • $HOME/.bash_profile
      • $HOME/.bashrc
      • $HOME/.bash_logout
    • unset命令
    • env命令
  • 1.3.四、shell中的一些經常使用環境變量

1.四、Linux Shell是解釋型語言

  • 1.4.一、編譯型語言和解釋型語言
  • 1.4.二、Linux Shell編程的優點

1.五、小結

chap2 shell編程基礎 15(27/334)

2.一、向腳本傳遞參數

  • 2.1.一、Shell腳本的參數

    • Shell編程中的函數

      • testfunc()
        {
            echo "$# parameters";
            echo "$@";
        }
    • shell編程中參數引用

      • 0,1,2...
      • *
      • @
      • #
      • $
      • !
      • ?
      • -
  • 2.1.二、參數的用途

    • [ps.sh]

      • #! /bin/sh
        ps -eLf | grep $1
    • mvmkdir命令

2.二、I/O重定向

  • 2.2.一、標準輸入、標準輸出與標準錯誤

    • cat命令後面的主要參數
  • 2.2.二、管道與重定向

    • ><>>|
    • head命令
  • 2.2.三、文件描述符
  • 2.2.四、特殊文件的妙用

    • /dev/null
    • /dev/zero
    • /dev/tty
    • read命令,我基本沒在命令中用過,最多編程中有用

2.三、基本文本檢索

  • grep相關命令

2.四、Unix/Linux系統的設計與shell編程

  • 2.4.一、一切皆文件

    • Linux文件的後綴名
    • Linux文件類型
    • ls命令
  • 2.4.二、UNIX編程的基本原則

2.五、小結

chap3 編程的基本元素 39(51/334)

3.一、再識變量

  • [variable.sh]
  • shell中有3種變量:

    • 用戶變量
    • 位置變量:在對參數判斷和命令返回值判斷時使用。也叫系統變量
    • 環境變量
  • 3.1.一、用戶變量
  • 3.1.二、位置變量

    • 也叫系統變量,直接引用只能$0~$9,超過要用括號,即${10}
    • [process.sh]
    • [Process2.sh]

      • #!/bin/sh
        if[ $# -ne 2 ];
        then
            echo "Usage: $0 string file";
            exit 1;
        fi
        grep $1 $2;
        
        if[ $? -ne 0 ];
        then
            echo "Not Found \"$1\" in $2";
            exit 1;
        fi
        echo "found \"$1\" in $2";
  • 3.1.三、環境變量
  • 3.1.四、啓動文件

3.二、函數

  • 0

    • 當shell執行函數時,並不獨立建立子進程。
    • shell執行命令的順序
    • 函數的使用規則
    • 自動加載
  • 3.2.一、函數定義

    • unset -f funcname 刪除函數
    • [user_login.sh]

      • #!/bin/bash
        function user_login()
        {
            if who | grep $1 >/dev/null
            then
                echo "User $1 is on."
            else
                echo "User $1 is off."
            fi
        }
  • 3.2.二、函數的參數和返回值

    • [演示函數的返回值]

      • #! /bin/bash
        add()
        {
            let "sum=$1+$2"
            return $sum
        }

3.三、條件控制與流程控制

  • 3.3.一、if/else語句
  • 3.3.二、退出狀態

    • $?返回上一條語句的退出狀態
    • 退出狀態值

      • 0:成功
      • >0:在重定向或單詞展開期間()失敗
      • 1~125:退出失敗
      • 126:命令找到,但沒法執行命令文件
      • 127:命令沒法找到
      • >128:命令因收到信號而死亡
  • 3.3.三、退出狀態與邏輯操做
  • 3.3.四、條件測試

3.四、循環控制

  • 3.4.一、for循環
  • 3.4.二、while/until循環

    • [遍歷PATH路徑]

      • path = $PATH
        while [ -n $path ];
        do
            ls -ld ${path%%:*} #ls -ld顯示path的第一個目錄
            path = ${path#*:} #截去path中第一個目錄和冒號
        done
  • 3.4.三、跳出循環

    • break
  • 3.4.四、循環實例

    • [例3.17 命令行參數處理]
    • [例3.18 getopt的使用]

      • author=false
        list=false
        file=""
        
        while getopt alf: opt
        do
            case $opt in
            f)  file=$OPTARG   #將-f參數的下一個參數截取至file變量
                ;;
            l)  list = true
                ;;
            a)  author = true
                ;;
            esac
        done
        
        shift ${{OPTIND - 1}} #刪除選項,留下參數
      • getopt分析命令行標誌和參數

3.五、小結

chap4 正則表達式 66(78/334)

  • 0

    • grep、sed、awk、more、vi

4.一、什麼是正則表達式

  • 4.1.1 正則表達式的普遍應用
  • 4.1.2 如何學習正則表達式

    • 讀例子;理解後再修改和實踐
  • 4.1.3 如何實踐正則表達式

    • 不斷修改、測試

4.二、正則基礎

  • 4.2.1 元字符

    • 都支持的meta字符

      • ^:錨定行或字符串的開始
      • $:錨定行或字符串的結束
      • .
      • *
      • [...]
      • \
    • 不一樣的meta字符
    • grep程序支持的meta字符plus
  • 4.2.2 單個字符

    • 通常字符
    • 轉義的meta字符
    • .(點號)字符
    • 方括號表達式
  • 4.2.3 單個表達式匹配多個字符
  • 4.2.4 文本匹配錨點
  • 4.2.5 運算符優先級
  • 4.2.6 更多差別

    • 後向引用
    • 分組
    • 交替

4.三、正則表達式的應用

  • 4.3.一、擴展

    • ed命令的演化成grep和sed
    • [例4.9 單詞的開頭結尾匹配]
    • GNU支持的額外正則表達式運算符
  • 4.3.2 案例研究:羅馬數字

    • [例4.11 檢驗百位數]
  • 4.3.3 案例研究:解析電話號碼

4.四、小結

chap5 基本文本處理 87(99/334)

  • 0

    • sort、uniq、cut、join、head、tail、grep、wc、fmt、fold、pr、tr

5.一、排序文本

  • 5.1.一、sort命令的行排序

    • 例5.1 使用sort命令按照ASCII順序排序文本 sort file.txt
    • 例5.2 字典序 sort -d file.txt
    • 例5.3 忽略大小寫差別 sort -d -f file.txt
  • 5.1.二、sort命令的字段排序

    • sort -t: -k3 -n /etc/group
  • 5.1.三、sort小結

    • 例5.5 sort命令不穩定性演示

5.二、文本去重

  • uniq

5.三、統計文本行數、字數以及字符數

  • wc

5.四、打印和格式化輸出

  • 5.4.一、使用pr打印文件
  • 5.4.二、使用fmt命令格式化文本
  • 5.4.三、使用fold限制文本寬度

5.五、提取文本開頭和結尾

  • headtail

5.六、字段處理

  • 5.6.一、字段的使用案例
  • 5.6.二、使用cut取出字段
  • 5.6.三、使用join鏈接字段
  • 5.6.四、其餘字段處理方法

    • awk

5.七、文本替換

  • 5.7.一、使用tr替換字符
  • 5.7.二、其餘選擇

    • sed、awk、perl、python

5.八、一個稍微複雜的例子

  • 5.8.一、實例描述
  • 5.8.二、取出記錄的ip字段和id字段
  • 5.8.三、將記錄按照ip順序排序
  • 5.8.四、使用uniq統計重複ip
  • 5.8.五、根據訪問次數進行排序
  • 5.8.六、提取出現次數最多的100條

5.九、小結 

chap6 文件和文件系統 118(130/334)

  • 0

    • ls、cat、chown、chgrp、chmod、umask、mkdir、touch、find、xargs、comm、diff、vimdiff、fdisk、mkfs、df、mount

6.一、文件

  • 6.1.一、列出文件
  • 6.1.二、文件的類型
  • 6.1.三、文件的權限

    • chownchgrp,以及chmod
  • 6.1.四、文件的修改時間

    • touch更新文件的訪問和修改時間

6.二、尋找文件

  • 6.2.一、find命令的參數
  • 6.2.二、遍歷文件

    • [例6.10 xargs使用]

      • find /tmp -type f -print | xargs file

6.三、比較文件

  • 6.3.一、使用comm比較排序後文件

    • comm file1 fiel2
  • 6.3.二、使用diff比較文件
  • 6.3.三、其餘文本比較方法

    • vimdiff

6.四、文件系統

  • 6.4.一、什麼是文件系統
  • 6.4.二、文件系統與磁盤分區
  • 6.4.三、linux分區格式的選擇與安全性
  • 6.4.四、文件系統與目錄樹
  • 6.4.五、文件系統的建立與掛載

6.五、小結

chap7 流編輯 155(167/334)

7.一、什麼是sed

  • 7.1.1 挑選編輯器

    • VI是交互式編輯器。
    • sed是流編輯器,能夠對從管道這樣的標準輸入接收的數據進行編輯。
  • 7.1.2 sed的版本

    • sed --version

7.二、sed示例

  • 7.2.1 sed的工做方式

    • sed是基於行的,不修改任何輸入文件,將結果寫入標準輸出(stdout)
    • sed -e 'd' /tmp/passwd.bak # d是刪除,所有刪除
    • sed -e '5d' /tmp/passwd.bak # 刪除第5行
  • 7.2.2 sed工做的地址範圍
  • 7.2.3 規則表達式

7.三、更強大的sed功能

  • 7.3.1 替換

    • sed -e 's/power/jiechen/g' /tmp/a.c #s是替換,g是全局
  • 7.3.2 地址範圍的迷惑

7.四、組合命令

  • 7.4.1 組合多條命令

    • sed -n -e '=;p' /tmp/passwd.piece
  • 7.4.2 將多條命令應用到一個地址範圍

7.五、實際的例子

  • sed -e 's/$/\r/' myunix.txt > mydos.txt

7.六、sed實踐 167

  • 7.6.1 第一步 替換名字
  • 7.6.2 第二步 刪除前3行
  • 7.6.3 第三步 顯示5~10行
  • 7.6.4 第四步 刪除包含lane的行
  • 7.6.5 第五步 顯示生日在november-december之間的行
  • 7.6.6 第六步 把3個星號(*)添加到以fred開頭的行
  • 7.6.7 第七步 用jose hasretired取代包含jose的行
  • 7.6.8 第八步 把popeye的生日改爲11/14/46
  • 7.6.9 第九步 刪除全部空白行
  • 7.6.10 第十步 腳本

7.七、小結

chap8 文本處理利器awk 176(188/334)

8.一、來個案例

  • awk '{print $0}' /etc/fstab # print $0是打印整行,print和print $0效果是同樣的
  • awk經常用於處理字段,我我的理解爲列處理

8.二、基本語法

  • 8.2.1 多個字段
  • 8.2.2 使用其餘字段分隔符

    • awk -F ":" '{print "USER: "$1 "\tSHELL: "$7}' /tmp/passwd.piece
    • ‘-F’設置的是awk的初始化變量FS,FS默認的字段分格符是空白字符,如今改爲冒號

8.三、awk語言特性

  • 8.3.1 awk代碼結構
  • 8.3.2 變量與數組
  • 8.3.3 算術運算和運算符
  • 8.3.4 判斷與循環
  • 8.3.5 多條記錄

8.四、用戶自定義函數

  • 8.4.1 自定義函數格式
  • 8.4.2 引用傳遞和值傳遞
  • 8.4.3 遞歸調用

8.五、字符串與算術處理

  • 8.5.1 格式化輸出
  • 8.5.2 字符串函數
  • 8.5.3 算術函數

8.六、案例分析

  • 8.6.1 生成數據報表
  • 8.6.2 多文件聯合處理
  • 8.6.3 檢驗passwd格式的正確性
  • 8.6.4 sed/awk單行腳本

8.七、小結 222

收穫

履歷

  • 20190314過了一遍chap1和2,仍是有一些知識點不知道的。

    • shell中的參數引用就不熟。
  • 20190315過了一遍chap3-5。

    • chap03來看,仍是自已讀、寫shell有點少,語法有些點不懂外,寫得就更少,要從基礎的實踐一下,以爲門入得還不深。
    • chap04正則基本都會用到,但各類細節和元字符並無徹底瞭解。
    • 畢竟沒有處理過文本,chap5裏的命令大部分是我沒有接觸的,更沒說對參數的瞭解了,但基本上屬於一講仍是能懂的啊。
  • 20190316過了一遍chap6

    • find裏的xargs參數;以及comm命令,我用得確實很少。
  • 20190318過了一遍chap七、08

    • 熟悉了一下sed的各個參數,例子場景不錯,但我尚未實踐呢。
    • chap08只是簡單看看,原來'awk'還能夠自成函數,這個反正是不記得了,不清楚之前看沒看過呢。awk要好好學學
相關文章
相關標籤/搜索