將shell指令碼用到實處

來源:互聯網
上載者:User
1、產生有規律的。

       今天在網上搜一篇英文文章,得到一個,http://web.eecs.umich.edu/~silvio/teaching/EECS598/lectures/lecture10_3.pdf,猜想應該還有別的pdf的地址,試了試果然有幾個,如lecture10_1和lecture10_2,就想著把類似的地址都產生出來,然後用wget下載,就可以實現批量下載了。

#!/bin/sh# download links http://web.eecs.umich.edu/~silvio/teaching/EECS598/lectures/*link_prefix="http://web.eecs.umich.edu/~silvio/teaching/EECS598/lectures/"for lec_num in `seq 0 1 10`dofor pdf_num in `seq 0 1 5`dowget ${link_prefix}lecture${lec_num}_${pdf_num}.pdfdonedoneexit 0

2、獲得shell指令碼所在目錄的絕對路徑

原文:http://www.zeali.net/entry/497

        要得到正在執行的程式/指令碼自身所存放的絕對路徑,在 PHP 裡面可以用dirname(realpath(__FILE__)) ;
C# 則有System.Windows.Forms.Application.StartupPath ; java 似乎沒有什麼比較直接的方法,只能利用
CodeSource 來間接擷取 。而在 linux shell 指令碼裡面如果想得到當前指令檔存放的絕對路徑,也沒有太現成的命令可以調用,不過可以通過下面的語句來擷取:

baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)echo "full path to currently executed script is : ${baseDirForScriptSelf}"

雖說大部分情況下我們並不需要這樣的絕對路徑來完成工作;但如果要把多個指令碼、資料檔案等內容打包作為一個整體來交付別人使用,又希望不論使用者拷貝到哪個目錄下執行指令碼都能夠正確的找到這個包裡面的其他內容的話,用這樣的指令碼來自動定位包的根目錄應該是個比較魯棒的做法。

3、添加一個新的環境變數

原來自己的工作目錄不夠用了,所以想設定一個新的環境變數WORK, 然後執行 cd $WORK,就可以切換到新工作目錄。

$vim ~/.bashrc

WROK=/run/media/huntinux/F/huntinux_work

儲存退出關閉終端,再開啟終端 (或者$source ~/.bashrc 這樣不必重啟終端)

$echo $WORK

/run/media/huntinux/F/huntinux_work

$cd $WORK

成功。

(關於~/.bashrc
~/.bash_profile等的區別將這裡)

4、刪除c源檔案中未使用的變數。       如果這樣未使用的變數太多,顯然手動刪除太麻煩,所以想到用shell幫忙。
for i in `gcc -Wall main.c -lm 2>&1 | sed "1,2d" |tr '‘’' '  ' | cut -d' ' -f8`dosed -i '/'"$i"'/d' main.c done

其中需要把gcc的錯誤輸出重新導向到標準輸出這樣才可以使用管道。接下的sed用於刪除第一第二行。tr用來將‘’替換成空格cut用來得到未使用的變數名接下來的迴圈使用sed刪除包含這些變數的行,並更新檔案。

5、對自己寫的程式進行測試。例如poj 1328  , 將測試資料儲存到一個檔案中,比如testdata,然後執行下面的指令碼就不用每次都自己手動輸入測試資料了。
#! /bin/sh## recompile and test the program#gcc -Wall main.c -lm && cat testdata | ./a.outexit 0

6、從daomubiji.com 下載網頁,並提取出小說內容。wget+sed+tr+cut+grep+basename+cat.代碼有空貼上來。

#! /bin/sh## 從daomubiji.com提取完整的小說# v1.1# MAINURL="www.daomubiji.com"# index.html's locationPWD=`pwd`TMP="$PWD/tmp"# temp dirPAGESDIR="$TMP/pages"# each chapter page's local locationNOVELDIR="$TMP/novel"# each chapterMAINPG="$TMP/index.html"# index.html local locationURLS="$TMP/urls"# contains all the pages' urlSUFFIX=".txt"# suffix of novel# 從下載的網頁中提取小說內容# 參數0表示要提取內容的網頁extract_page(){ echo "extract page $1"# 得到章節名稱title=`grep "<h1>" $1 | cut -d'>' -f2 | cut -d'<' -f1 | tr ' ' '_'`title=$title$SUFFIX# 得到卷名chapter=` echo $title | cut -d'_' -f1`echo -e "title = $title\nchapter = $chapter"# 建立卷目錄if [ ! -d  $NOVELDIR/$chapter ];thenmkdir -p $NOVELDIR/$chapterelseecho "directory $chapter exists."fi# 提取小說內容儲存在相應卷目錄filepath=$NOVELDIR/$chapter/$title  if [ ! -e $filepath ]; thencat $1 | sed '/精彩評論/,$d' \| grep -E "<p>  |<h1>" \| sed 's=<span[^<]*</span==g'  \| tr "<p>/h1" "      ">$filepathelseecho "file $title exists"fi}# 下載每個頁面,並調用extract_page來提取小說內容down_extract(){# for i in `cat $URLS | xargs`# 使用xargs以防止參數過大。有必要嗎?for i in `cat $URLS`dofilename=`basename $i`if [ ! -e $PAGESDIR/$filename ]; thenwget -P $PAGESDIR $ielseecho "$filename already exists."fiextract_page $PAGESDIR/$filenamedone}# 得到含有所以章節串連的網頁get_index(){if [ ! -e $MAINPG ]; then# wget -P $TMP $MAINURL # 1>/dev/null 2>/dev/null  -P 用來指定下載目錄wget -P $TMP $MAINURL # 1>/dev/null 2>/dev/null elseecho "index.html already exists."fi}# 得到首頁上的所以章節的連結地址parse_index(){# 應為網頁上的連結有可能更新,而且產生所有的url的時間也不長# 所以沒有再判斷urls檔案是否存在sed -e '1,/盜墓筆記-南派三叔經典巨作/d' \-e  '/最新發行/,$d' $MAINPG \| grep "href"  \| cut -d"\"" -f2 >$URLSecho "Get all urls in $URLS"}# # start## 建立臨時目錄if [ ! -d $TMP ]; thenecho -e "Creat temporary directory: \\n$TMP\n$PAGESDIR\n$NOVELDIR"mkdir -p $TMP/{pages,novel} || {echo -e "Error while creating temporary directory: \\n$TMP\n$PAGESDIR\n$NOVELDIR"exit -1}elseecho "Directory $TMP exists."fi # 擷取index.htmlget_index# 解析index.htmlparse_index# 下載頁面,並提取小說內容down_extractexit 0

新版本: 支援中斷處理,色彩輸出,斷點續傳

#! /bin/sh## 從daomubiji.com提取完整的小說# 支援顏色,中斷處理,斷點續傳# Huntinux# 2013-8-20# v1.2#MAINURL="www.daomubiji.com"# index.html's locationPWD=`pwd`TMP="$PWD/tmp"# temp dirPAGESDIR="$TMP/pages"# each chapter page's local locationNOVELDIR="$TMP/novel"# each chapterMAINPG="$TMP/index.html"# index.html local locationURLS="$TMP/urls"# contains all the pages' urlURLSINT="$TMP/urlsint"# contains all the pages' urlSUFFIX=".txt"# suffix of novelINTFILE="$TMP/continue"## 如果在下載過程中受到終止訊號# 不管是否下載完,都刪除最後一個下載的網頁# 以保證網頁能完整下載# filename在down_extract()中定義# 並且將中斷處儲存到檔案INTFILE中,以便再次啟動並執行時候能續傳#trap 'red "Interrupt occurred while downloading:$filename"red "Delete file: $PAGESDIR/$filename"red "Save interrupt point in $INTFILE"rm -f $PAGESDIR/$filenameecho "$filename" >$INTFILEexit -1' INT## 彩色輸出#NORMAL=$(tput sgr0)GREEN=$(tput setaf 2; tput bold)YELLOW=$(tput setaf 3)RED=$(tput setaf 1)function red() {    echo -e "$RED$*$NORMAL"} function green() {    echo -e "$GREEN$*$NORMAL"} function yellow() {    echo -e "$YELLOW$*$NORMAL"}# 從下載的網頁中提取小說內容# 參數0表示要提取內容的網頁extract_page(){ green "Extract page $1"# 得到章節名稱# title=`grep "<h1>" $1 | sed -e "s=^.*<h1>==" -e "s=</h1>==" | tr ' ' '_'`# 上面的寫法有問題,貌似最後有一個斷行符號title=`grep "<h1>" $1 | cut -d'>' -f2 | cut -d'<' -f1 | tr ' ' '_'`title=$title$SUFFIX# 得到卷名chapter=` echo $title | cut -d'_' -f1`green "Title : $title -->Chapter : $chapter"# 建立卷目錄if [ ! -d  $NOVELDIR/$chapter ];thenmkdir -p $NOVELDIR/$chapterelseyellow "Directory $chapter exists."fi# 提取小說內容儲存在相應卷目錄filepath=$NOVELDIR/$chapter/$title  if [ ! -e $filepath ]; thencat $1 | sed '/精彩評論/,$d' \| grep -E "<p>  |<h1>" \| sed 's=<span[^<]*</span==g'  \| tr "<p>/h1" "      ">$filepathelseyellow "File $title exists"figreen "Done."}# 下載每個頁面,並調用extract_page來提取小說內容down_extract(){# 檢測是否需要斷點續傳if [ -e $INTFILE ]; thenred "Detect a interrupt, and continue..."intpoint=`cat $INTFILE` # 得到中斷時,正在下載的網頁名稱red "Continue downloading :$intpoint"echo $MAINURL/$intpoint >$URLSINT # 因為中斷的時候最後一個被刪除,所以把它放到第一個,繼續下載sed '1,/'"$intpoint"'/d' $URLS >>$URLSINT # 然後找到它後面的網址,也加入URLSINT檔案#rm -f $URLS# 刪除原來的urls檔案URLS=$URLSINT   # 修改URLS變數指向新的urlsint檔案fi# for i in `cat $URLS | xargs`# 使用xargs以防止參數過大。有必要嗎?for i in `cat $URLS`dofilename=`basename $i`if [ ! -e $PAGESDIR/$filename ]; thengreen "Downloading page :$i"wget -P $PAGESDIR $i 1>/dev/null 2>/dev/nullgreen "Done."elseyellow "$filename already exists."fiextract_page $PAGESDIR/$filenamedonered "Finished."}# 得到含有所以章節串連的網頁get_index(){if [ ! -e $MAINPG ]; then# wget -P $TMP $MAINURL # 1>/dev/null 2>/dev/null  -P 用來指定下載目錄green "Downloading $MAINURL/index.html"wget -P $TMP $MAINURL  1>/dev/null 2>/dev/null green "Done."elseyellow "index.html already exists."fi}# 得到首頁上的所以章節的連結地址parse_index(){# 應為網頁上的連結有可能更新,而且產生所有的url的時間也不長# 所以沒有再判斷urls檔案是否存在sed -e '1,/盜墓筆記-南派三叔經典巨作/d' \-e  '/最新發行/,$d' $MAINPG \| grep "href"  \| cut -d"\"" -f2 >$URLSgreen "Get all urls in $URLS"}# # 程式開始## 建立臨時目錄if [ ! -d $TMP ]; thengreen  "Creat temporary directory:$TMP,$PAGESDIR,$NOVELDIR"mkdir -p $TMP/{pages,novel} || {red  "Error while creating temporary directory:$TMP,$PAGESDIR,$NOVELDIR"exit -1}elseyellow "Directory $TMP exists."fi # 擷取index.htmlget_index# 解析index.htmlparse_index# 下載頁面,並提取小說內容down_extractexit 0

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.