【linux編程】生信編程-shell腳本編程-腳本格式

shell編程

shell定義

Shell 腳本是一個包含一連串 shell 命令語句的文本文件,通常以 .sh 為擴展名,可被當作一個獨立的程序來執行,從而實現數據的批量處理。其通常由 shell header (shebang) 和 body (命令語句) 兩部分組成。

Shell header

#!/bin/bash
set -e
set -u

!/bin/bash → shebang,表示執行該腳本所用的解釋器。整個腳本必須以這行開始,且必須放在腳本的開頭。

set -e (可選) → 如果任何語句的執行結果不是true則退出腳本 (遇到錯誤立即終止腳本) ,從而可以及時地修改腳本而大大地提高工作效率。

如果使用 set +e 則表示遇到錯誤報錯但繼續執行后續腳本。

set -u (可選) → 如果使用未定義的變量則報錯并退出腳本。

Body

代碼的主體部分描述 “需要做什么,如何去做”。例如定義變量,列出一系列需要執行的命令等,shell 會按照我們所寫的順序依次執行各個命令。當然,我們可以用#來做注釋,來增加復雜代碼的可讀性。

echo "Hello world!" #此處為注釋,不會顯示在輸出結果中
echo "This is my first shell script!"
path=$HOME
echo "List the content of the path $path"
echo "Contents:"
ls -l $path

如何執行 shell 腳本

直接用 sh 或 bash 命令執行腳本,如:

$ bash MyFirstShellScript.sh
$ sh ./MyFirstShellScript.sh 
$ sh /path/to/script/MyFirstShellScript.sh

賦予腳本可執行權限,直接執行腳本,如:

$ chmod u+x MyFirstShellScript 
$ chmod 755 MyFirstShellScript 
$ ./MyFirstShellScript
$ /path/to/script/MyFirstShellScript.sh

Shell 變量

shell 變量定義

Shell 變量可以存儲一定的信息 (輸入文件,參數的值,輸入文件目錄,輸出結果目錄和),從而在后續的命令中對這些信息進行處理。Shell 變量的值實際上都是字符串(沒有定義的變量默認是一個空字符串。Shell 變量可以不需要任何聲明而直接定義,變量名由字母、數字和下劃線組成,大小寫敏感;并且定義變量時等號兩邊不能有空格,否則會被認為是命令。在變量名前加 $ 來獲取變量的值。

shell 變量種類

  • 系統變量:由操作系統創建,如:$PATH, $HOME, $BASH 等。
  • 自定義變量:由用戶創建:如上例中的 $path。
$ echo $HOME
/root
$ echo $BASH
/bin/bash
$ path=$HOME
$ echo $path
/root

命令替換

使用$() 或 `` 來實現命令替換,即執行一個 shell 命令然后把輸出結果存到一個變量中。使用方式:var=$(command) 或 var=command

$ echo "Today is $(date "+%Y-%m-%d")"
Today is 2017-04-16
$ path=$HOME
$ command_output=`ls $HOME`
$ echo $command_output
Desktop Documents Downloads Music MyFirstShellScript.sh Pictures Public Videos

${} 的高級應用:取路徑、文件名、后綴、字符串和替換

規律

#是從左面開始匹配
%是從右面開始匹配

使用一個符號 (# 或 %) 是最小匹配
使用兩個符號 (## 或 %%) 是最大匹配

* 用來去掉不需要的字符
可以自己指定分割符號與 #, % 和 * 配合來決定取哪部分來替換

可以自己指定起始位置來決定提取哪部分字符串
可以使用 /str1/str2 來替換特定字符串
$ var=/home/username/data/test.txt.bac
$ echo ${var}
/home/username/data/test.txt.bac

$ echo ${var#*/}
#去掉第一個 / 及其左邊的字符串
home/username/data/test.txt.bac

$ echo ${var##*/}
#去掉最后一個 / 及其左邊的字符串
test.txt.bac

$ echo ${var%/*}
#去掉最后一個 / 及其右邊的字符串
/home/username/data

$ echo ${var%%/*}
#去掉第一個 / 及其右邊的字符串 (輸出結果為空)

$ echo ${var#*.} 
#去掉第一個 . 及其左邊的字符串
txt.bac

$ echo ${var##*.} 
#去掉最后一個 . 及其左邊的字符串
bac

$ echo ${var%.*} 
#去掉最后一個 . 及其右邊的字符串
/home/username/data/test.txt

$ echo ${var%%.*} 
#去掉第一個 . 及其右邊的字符串
/home/username/data/test

$ echo ${var:0:5} 
#取第0位后的5個字節
/home

$ echo ${var:5:9} 
#取第5位后的9個字節
/username

$ echo ${var/username/cat} 
#將 username 替換為 cat
/home/cat/data/test.txt.bac

$ echo ${#var} 
#取變量的長度

引用

引用是指用引用符號將字符串引起來,以防其中的特殊字符被 shell 解釋為其它含義。我們可以通過引用來控制‘命令替換’或把含有空格 (或其它特殊字符) 的字符串做為一個整體進行參數傳遞。

Shell 中三種常見的引用形式:

' ' (單引號) 所有字符保持原義但字符串中不能出現單引號本身 (全引用)

z 除 $, ` 和 \ 以外的所有字符保持原義 (部分引用)

\ (反斜線) 轉義字符,使接下來的一個字符保持原義

單引號和雙引號的區別:

在引用內容為純文本時,二者沒有本質差別。

如果想要獲取變量的值時,則需要使用雙引號。

$ test="world"

$ echo "Hello $test"
Hello World

$ echo 'Hello $test'
Hello $test

轉義

在某些情況下,我們需要保留特殊字符的原義,這時就需要用 \ 來轉義。舉個例子:

$ var="Hello world"
$ echo "The content of variable '\$var' is \"$var\""
The content of variable '$var' is "Hello world"

Shell 腳本中的參數傳遞

Shell 腳本可以從命令行獲取參數,這些參數被存入變量 $1, $2, $3 ... 中,這些變量被稱為特殊變量。

特殊變量 含義
$# 從命令行傳遞給腳本的參數個數
$0 當前執行腳本的名字
$n 從命令行傳遞給腳本的參數,從左到右被存入變量:$1, $2, $3 ... $9
$* 從命令行傳遞給腳本的所有參數
$@ 從命令行傳遞給腳本的所有參數
$$ 當前 shell 進程的 PID
$? 上一個執行命令的返回值

#!/bin/bash
set -e
set -u
echo "number of arguments: $#"
echo "script name is: $0"
echo "first argument is: $1"
echo "second argument is: $2"
echo "all arguments are: $*"
echo "all arguments are: $@"
echo "process number of the current process is: $$"
echo "exit value of the last command executed: $?"

執行腳本
sh test.sh hello world

顯示結果

number of arguments: 2
script name is: test.sh
first argument is: hello
second argument is: world
all arguments are: hello world
all arguments are: hello world
process number of the current process is: 106836
exit value of the last command executed: 0

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容

  • 概述 首先,咱們來了解一下,什么是Shell。操作系統內核給我們提供了各種接口,同時也提供了各種用戶層的庫,理論上...
    keysaim閱讀 1,390評論 0 0
  • 這是我第一次嘗試使用雙拼輸入法翻譯一篇日本的Liunx基礎教材上的一章。共花費一周左右。 shell的使用 前言 ...
    今後次閱讀 1,057評論 0 4
  • 一、shell腳本介紹 1.1 開頭(環境使用shebang機制) #!/bin/bash 必須寫在文件首行 符號...
    優果馥斯閱讀 3,316評論 0 1
  • 一、什么是Shell腳本 示例 看個例子吧: 示例解釋 第1行:指定腳本解釋器,這里是用/bin/sh做解釋器的 ...
    Rick617閱讀 796評論 0 1
  • 10.11號!今天是女兒升入初中的第一次月考。 昨天數學老師都班級里做了個模擬,女兒滿分,連附加題都做對了。班主任...
    欣寳dx閱讀 379評論 0 0