bash shell學習-實踐 (本身實現一些小工具)

  The poor starve while the rich feast.git

  "窮人飢腸轆轆,富人大吃大喝"正則表達式

 

參考資料鳥哥的Linux私房菜 基礎學習篇(第三版) shell

       Linux Shell腳本攻略 編程

         Linux程序設計(第四版)數組

 

1、簡易單詞管理程序bash

  簡介: 本程序主要用於記錄和查詢英文單詞信息,可能沒有什麼實際用途,也可能代碼中有一些不太簡潔的實現,主要是由於編寫本程序的目的是爲了熟練一下shell script編程的基礎知識ide

  功能: ①單詞查詢; ②單個單詞導入詞庫; ③從文件導入詞庫;④統計詞庫信息;函數

  程序結構: 一個Bash shell程序 explain (解釋), 一個詞庫文件: .word_lib.txt , 保存在用戶家目錄下的  .word_manager 目錄中學習

  文件內容:  .word_lib.txt 是詞庫文件,保存全部單詞信息, 每行一個單詞, 包括: 原型, 中文意思。全部單詞信息已通過排序去重處理; spa

  程序執行流程: 解析命令選項-->根據解析結果執行對應的操做-->退出程序

  程序介紹:

 1 用法: explain [-afcb] [單詞|文件名] [單詞信息]
 2 選項: 
 3   不帶選項: 查詢單詞並打印出查詢結果,結果格式: word  中文意思
 4   -a  : 將單詞信息導入詞庫,後跟單詞和單詞信息
 5   -f  : 從文件導入詞庫,後跟文件名
 6   -c  : 統計詞庫中的單詞總數
 7   -b  : 瀏覽詞庫的單詞信息(經過more命令打開)

8 全部正確的命令格式: 9   explain word #查詢word指定的單詞 10   explain -c   #打印出詞庫當前共有多少個單詞 11   explain -b   #瀏覽詞庫的單詞信息 12   explain -a word wordinfo #添加單詞信息至詞庫 13   explain -f filename    #將文件導入詞庫,要求格式一致 14 15 說明:word能夠爲英文單詞,也能夠爲中文,只要詞庫中某一行包含word,就會打印出該行,因此查詢結果可能包含多行
16 退出碼: 17   0 :程序執行成功 18   1 :沒有輸入選項和參數 19   2 :輸入了未知的選項 20   3 :-a後面沒有跟着單詞和解釋 21   4 :-f後面沒有文件名或者是不存在的文件

  源碼以下:

  1 #/bin/bash - 
  2 #===============================================================================
  3 #
  4 #          FILE: explain.sh
  5 # 
  6 #         USAGE: ./explain.sh 
  7 # 
  8 #   DESCRIPTION: 簡易單詞管理程序
  9 # 
 10 #       OPTIONS: ---
 11 #  REQUIREMENTS: ---
 12 #          BUGS: ---
 13 #         NOTES: ---
 14 #        AUTHOR: Aut (yinjing), autyinjing@126.com
 15 #  ORGANIZATION: 
 16 #       CREATED: 2015年06月29日 16:23
 17 #      REVISION:  ---
 18 #===============================================================================
 19 
 20 # 1 可執行文件的查找路徑設置
 21 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
 22 export PATH
 23 
 24 # 2 相關的全局變量聲明和設置
 25 home_path=~/.word_manager               #相關文件的主目錄
 26 lib_path=$home_path/.word_lib.txt       #詞庫文件的路徑
 27 
 28 # 3 相關目錄和文件的設置
 29 if [ ! -d "$home_path" ]; then
 30         mkdir $home_path        #~/.word_manager
 31         touch $lib_path         #~/.word_manager/.word_lib.txt
 32 fi
 33 
 34 # 4 相關函數實現
 35 function query()                #直接查詢單詞信息
 36 {
 37         ret=$(cat $lib_path | grep "$1")
 38         if [ -z "$ret" ]; then
 39                 echo "$1 not be found!"
 40         else
 41                 echo "$ret"
 42         fi
 43 }
 44 
 45 function update_lib()           #對詞庫進行排序去重,目前尚未想到更好的方法,只能利用臨時文件
 46 {
 47         cat $lib_path | sort -fb | uniq > ~/.word_manager/._word_lib.txt
 48         rm $lib_path
 49         mv ~/.word_manager/._word_lib.txt $lib_path
 50 }
 51 
 52 function print_count()
 53 {
 54         ret=$(wc -l $lib_path | cut -d ' ' -f1 | grep '[[:digit:]]')
 55         echo "當前詞庫共有$ret個單詞"
 56 }
 57 
 58 function add_to_lib()           #添加單詞到詞庫
 59 {
 60         word=$1\ $2             #將新的單詞信息保存爲一整行
 61         echo "$word" >> $lib_path    #~/.word_manager/.word_lib.txt
 62         update_lib
 63         echo "成功將 $word 導入詞庫!"
 64         print_count
 65 }
 66 
 67 function add_from_file()        #經過文件導入詞庫
 68 {
 69         cat $1 >> $lib_path     #~/.word_manager/.word_lib.txt
 70         update_lib
 71         echo "成功將 $1 內的單詞導入詞庫!"
 72         print_count
 73 }
 74 
 75 function browse_lib()
 76 {
 77         echo ""
 78         more $lib_path
 79         echo ""
 80         print_count
 81 }
 82 
 83 function print_help()
 84 {
 85         echo ""
 86         echo "用法: explain [選項] [單詞|文件名] [單詞信息]"
 87         echo ""
 88         echo "選項:"
 89         echo "  不帶選項: 查詢單詞並打印出查詢結果"
 90         echo "  -a     : 將單詞信息導入詞庫,後跟單詞和單詞信息"
 91         echo "  -f     : 從文件導入詞庫,後跟要導入的文件名"
 92         echo "  -c     : 統計詞庫中的單詞總數"
 93         echo "  -b     : 瀏覽詞庫中單詞信息"
 94         echo "  --help : 顯示幫助信息"
 95         echo ""
 96 }
 97 
 98 # 5 主程序部分
 99 if [ "$#" -lt 1 ]; then         #首先判斷命令格式是否正確
100         print_help
101         exit 1
102 fi
103 
104 opt=$(echo $* | cut -d ' ' -f1 | grep '^-')     #解析選項
105 case $opt in
106         "")
107                 query $1
108                 ;;
109         "-a")
110                 if [ "$#" -eq "3" ]; then
111                         add_to_lib $2 $3
112                 else
113                         echo "正確格式:explain -a word wordinfo"
114                         exit 3
115                 fi
116                 ;;
117         "-f")
118                 if [ -f "$2" ]; then
119                         add_from_file $2
120                 else
121                         echo "不存在的文件 $2"
122                         exit 4
123                 fi
124                 ;;
125         "-c")
126                 print_count
127                 ;;
128         "-b")
129                 browse_lib
130                 ;;
131         "--help")
132                 print_help
133                 ;;
134         *)
135                 echo "未知的選項,輸入 explain --help 查看幫助信息"
136                 exit 2
137 esac
138 
139 exit 0
View Code

  使用截圖以下,筆者已增長了文件的可執行權限並複製到/usr/bin/,因此能夠直接輸入程序名來執行命令

  空的詞庫:(不知道爲何圖片和文字之間的間隔那麼大,並無空行~~)

  添加單個單詞: 

  從文件導入詞庫:

  查詢:

  篇幅有限,錯誤的命令提示就不發圖了

 

2、迴文串檢測程序

  程序說明:本程序用於檢測一個文件內的迴文單詞,並將全部迴文單詞按照每一個一行的格式打印出來

1 用法:match_plalindrome filename
2 輸出:按照單詞長度遞增的順序打印出全部的迴文單詞(默認檢測長度在3~20之間的單詞)
3 核心思想:用正則表達式中的'(.)'匹配任意字符,再用反向引用 '...\2\1' 匹配前面的任意字符達到檢測迴文串的目的,詳細內容參見下面源碼
4 說明:程序默認將 空格、,、.、?、:、! 做爲單詞分隔符

  程序源碼:

 1 #!/bin/bash - 
 2 #===============================================================================
 3 #
 4 #          FILE: match_plalindrome.sh
 5 # 
 6 #         USAGE: ./match_plalindrome.sh 
 7 # 
 8 #   DESCRIPTION: 
 9 # 
10 #       OPTIONS: ---
11 #  REQUIREMENTS: ---
12 #          BUGS: ---
13 #         NOTES: ---
14 #        AUTHOR: Aut (yinjing), autyinjing@126.com
15 #  ORGANIZATION: 
16 #       CREATED: 2015年06月30日 19:13
17 #      REVISION:  ---
18 #===============================================================================
19 
20 # 1 判斷命令格式是否正確
21 if [ "$#" -ne 1 ];
22 then
23         echo "Usage: $0 filename"
24         exit 1
25 fi
26 
27 # 2 全局變量的聲明和設置
28 filename=$1             #要查找的文件名
29 tmpfile=tmp.txt         #臨時文件的文件名
30 declare -i count        #迴文串的重複部分長度
31 
32 # 3 因爲原文件中的內容可能不是每行一個單詞,因此這裏要使用一個臨時文件將原文件的信息轉換爲每行一個單詞
33 cat $filename | tr '[ ,.?:!]' '\n' > $tmpfile    #將全部的標點符號及空格替換爲換行符
34 sed -i '/^$/d' $tmpfile         #刪除全部空行
35 
36 # 4 默認查找長度爲3到20的迴文串
37 for ((len=3; len<=20; len++))   #循環查找各個長度的迴文串
38 do
39         basepattern='/^\(.\)'   #基礎模式
40         count=$(( $len / 2 ))   #計算重複部分的長度
41         
42         for ((i=1; i<$count; i++))      #設置正則表達式
43         do
44                 basepattern=$basepattern'\(.\)'
45         done
46 
47         if [ $(( $len % 2 )) -ne 0 ];     #判斷字符串長度是奇數仍是偶數並設置對稱軸
48         then
49                 basepattern=$basepattern'.'
50         fi
51 
52         for ((count; count>0; count--)) #設置反向引用
53         do
54                 basepattern=$basepattern'\'"$count"
55         done
56 
57         basepattern=$basepattern'$/p'   #添加打印參數
58 
59         sed -n "$basepattern" $tmpfile
60 done
61 
62 # 5 刪除臨時文件
63 rm $tmpfile
64 
65 exit 0
View Code

  運行截圖:

3、其餘命令(持續更新...)

  一、用awk實現head

1 $ awk 'NR <= 10' filename   
2 說明:打印行號小於等於10的行

  二、用awk實現tail

1 $ awk '{ buffer[NR % 10] = $0; } END { for (i=1;i<11;i++) { print buffer[i%10] } }' filename   
2 說明:用數組保存文件的最後10行,而後打印

  三、用awk實現tac

1 $ awk '{ buffer[NR] = $0; } END { for (i=NR; i>0; i--) { print buffer[i] } }'  
2 說明:順序保存,而後逆序打印

 

總結:剛開始學寫腳本,感受一切好神奇,實現一點簡單的功能都好牛X,呵呵~~之後必定多多加油

相關文章
相關標籤/搜索