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
shell腳本基本結構
shell腳本的兩個基本結構就是判斷結構和循環結構,判斷結構使用方法以下所示:
if [ 判斷條件 ]; then執行命令1elif [ 判斷條件 ]; then執行命令2fi
不一樣判斷條件之間能夠經過邏輯鏈接符鏈接,接下來咱們經過一個askfor help小腳原本練習:
#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 當串str1和str2不等時爲真
-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 變量名 in 單詞組do 執行命令done
其中單詞組不一樣單詞之間空格或者換行符分隔,例如咱們進入不一樣項目文件夾批量解壓序列文件:
for id in `ls`do cd $id gzip -d raw_reads.fq.gz cd ..done
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 $@
假如想設置命令行選項,可使用getopts函數,該函數能夠將命令行內容轉換爲變量。getopts包含兩個內置變量,OPTARG和OPTIND。OPTARG就是將選項後面的參數保存在這個變量當中;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 $*

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