shell編程:編程就是這麼簡單

Q:

什麼是shell編程?javascript

A:

shell編程就是經過語法將bash命令或外部命令整合起來,搭配正則表達式、管道命令與數據流定向等功能,來實現咱們要完成的任務最簡單的shell script就是將多條命令寫在一塊兒,讓用戶能夠一次性執行多條命令,同時每一個命令及其輸入參數得以在純文本的shell腳本中保存。shell腳本運行較慢,使用CPU資源較多,是一個很好的項目管理工具,但通常不用於大數據處理(注:本文部分例子來自《鳥哥的Linux私房菜》)。java


0 1

shell腳本基本編寫規則node

shell腳本基本規則以下:正則表達式

命令的執行是由上而下,自左而右,空白行會被忽略;shell

空格不可省略,多個空格會被忽略;編程

每讀到一個[Enter]命令就開始執行,拓展下一行可使用\[Enter]數組

命令的執行須要加絕對路徑,不然默認在當前路徑尋找腳本命令;ruby

經過環境變量PATH可設置腳本命令的查詢範圍,來簡化腳本。bash

一個簡單的shell腳本helloword以下所示:微信

#!/bin/bash#Show "Hello World!" in the screen#20170320 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHecho -e "Hello World! \n"exit 1
腳本通常分爲四部分。其中第一行 #!/bin/bash 聲明腳本類型(更爲廣泛來講是語言解釋器的路徑),爲 bash 腳本,除此以外其他 # 後面均爲註釋內容;以後爲腳本環境變量例如 PATH LANG 設置,對於命令的執行很是重要;第三部分爲主要程序執行部分,上面程序的含義是在屏幕上顯示 「Hello World!」 -e 表示使反斜槓轉義, 「\n」 表示換行並插入新一行;第四部分爲告知執行結果,利用 exit 能夠自定義錯誤信息,可使用環境變量?查看。腳本運行以下所示:

0 2

shell腳本基本結構

shell腳本的兩個基本結構就是判斷結構和循環結構,判斷結構使用方法以下所示:

if [ 判斷條件 ]; then執行命令1elif [ 判斷條件 ]; then執行命令2fi

不一樣判斷條件之間能夠經過邏輯鏈接符鏈接,接下來咱們經過一個askfor help小腳原本練習:

#!/bin/bash#ask if you can help me# 20170330 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHread -p "Can you help me (Y/N): " answerif [ "$answer" == "Y" ] || [ "$answer" == "y" ]; then#其中 [ "$answer" == "Y" ] || [ "$answer" == "y" ]也能夠改寫爲[ "$answer" == "Y" -o "$answer" == "y" ]echo "I'm so glad to hear that, thank you!"elif [ "$answer" == "N" ] || [ "$answer" == "n" ]; thenecho "Thank you all the same!"elseecho "Sorry, i can't understand you!"exit 1fi

運行示例以下:

if可使用的判斷符號有:

字符串判斷

str1== str2  當兩個串有相同內容、長度時爲真

str1!= str2   當串str1str2不等時爲真

-nstr1          當串的長度大於0時爲真(串非空)

-zstr1          當串的長度爲0時爲真(空串)

str1              當串str1爲非空時爲真

數字的判斷

int1-eq int2        兩數相等爲真

int1-ne int2        兩數不等爲真

int1-gt int2        int1大於int2爲真

int1-ge int2        int1大於等於int2爲真

int1-lt int2         int1小於int2爲真

int1-le int2         int1小於等於int2爲真

文件的判斷

-rfile    用戶可讀爲真

-wfile   用戶可寫爲真

-xfile    用戶可執行爲真

-ffile    文件爲正規文件爲真

-dfile   文件爲目錄爲真

-cfile    文件爲字符特殊文件爲真

-bfile    文件爲塊特殊文件爲真

-sfile    文件大小非0時爲真

-tfile    當文件描述符(默認爲1)指定的設備爲終端時爲真

複雜邏輯判斷

-a  

-o  

!    

while循環結構使用方法以下:

while [ 條件 ] do執行命令done

或者更爲簡單的能夠在命令行執行的:

while 條件; do 執行命令; done

下面是一個選擇食物的selectfood腳本:

#!/bin/bash#to input foods you like# 20170330 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHwhile [ "$word" != "END" -a "$word" != "end" ]#或者 until [ "$word" == "END" -o "$word" == "end" ]doread -p "Please input the foods you like, and press END to stop: " worddoneecho "OK! Now i know what you want eat."

運行示例以下:

另外一個更爲經常使用的循環結構是 for 循環,經常使用來批量執行任務,以下所示:
for 變量名 in 單詞組do 執行命令done

其中單詞組不一樣單詞之間空格或者換行符分隔,例如咱們進入不一樣項目文件夾批量解壓序列文件:

for id in `ls`do cd $id gzip -d raw_reads.fq.gz cd ..done
0 3

shell腳本命令行參數

命令行參數是程序與用戶交互的重要過程,能大大提升程序腳本的適用性。前面的 read 命令就是一個用戶與程序交互的過程。在 shell 腳本中,命令行參數能夠直接加在腳本後面,在腳本里使用默認變量「 $n 」來調用( n 爲非負整數),下面經過一個小例子來了解 shell 腳本命令行參數使用方法:
echo $0echo $1echo $2

將上面腳本保存爲sh04.sh並運行:

能夠看出第一個變量$0爲腳本名字,從$1開始爲用戶輸入數據。當n大於10時須要添加大括號,例如${10}

if結構裏添加參數-n能夠檢查命令行參數是否存在,$#能夠表示參數個數,$@用來提取全部參數並構成數組,$*用來提取全部參數並構成字符串,以下所示:

if [ -n 「$1」 ]; then echo "Arguments exist!"else echo "No arguments"fiif [ $# -ne 2 ]; then echo "There are $#arguments"fiecho $@
將上面腳本保存爲 sh05.sh ,運行以下所示:

假如想設置命令行選項,可使用getopts函數,該函數能夠將命令行內容轉換爲變量。getopts包含兩個內置變量,OPTARGOPTINDOPTARG就是將選項後面的參數保存在這個變量當中;OPTIND:這個表示命令行的下一個選項或參數的位置。

語法格式:getopts[option[:]] VARIABLE

getopts有兩個參數,第一個參數是一個字符串,包括字符和「:」,每個字符都是一個有效的選項,若是字符後面帶有「:」,表示這個字符有本身的參數。getopts從命令中獲取這些參數,而且刪去了「-」,並將其賦值在第二個參數中,若是帶有本身參數,這個參數賦值在「OPTARG」中。

具體實例以下所示:
echo $*while getopts ":a:bc" optdo case $opt in a ) echo $OPTARG echo $OPTIND;; b ) echo "b $OPTIND";; c ) echo "c $OPTIND";; ? ) echo "error" exit 1;; esacdoneecho $OPTINDshift $(($OPTIND - 1))#經過shift $(($OPTIND - 1))的處理,$*中就只保留了除去選項內容的參數,能夠繼續使用後面的位置參數。echo $0echo $*
其中 ":a:bc" ,這就是一個選項字符串。對應到命令行就是 -a ,-b ,-c 。冒號又是什麼呢?第一個冒號表示忽略錯誤,選項後面的冒號表示參數,一個冒號就表示這個選項後面必須帶有參數,可是這個參數能夠和選項連在一塊兒寫,也能夠用空格隔開,好比 -a123 -a 123 (中間有空格) 都表示 123 -a 的參數;兩個冒號的就表示這個選項的參數是可選的,便可以有參數,也能夠沒有參數,但要注意有參數時,參數與選項之間不能有空格。將上面腳本保存爲 getopts.sh 。並運行以下所示:

本文分享自微信公衆號 - 微生態與微進化(MicroEcoEvo)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索