開(kāi)頭
#!/bin/bash
set -e
set -u
set -o pipeline
中間
將日常中不斷重復(fù)的工作寫(xiě)到腳本中止吁。但是為了腳本具有普遍適用性把篓,所以要用到
變量和命令參數(shù)
條件語(yǔ)句
循環(huán)語(yǔ)句和文件名替換
# set work path
PATH=/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
work_dir=$1
sample_info=$2
reference=${work_dir}/data/reference/TAIR10_chr_all.fas
命令參數(shù)
就是命令后接的部分单旁,例如cat some.file
的命令參數(shù)就是some.file拦赠。我們可以利用這個(gè)功能從外界傳入自定義的內(nèi)容巍沙。shell腳本以$0,$1,$2,$3..
分別代表命令自身,第一個(gè)參數(shù)荷鼠,第二個(gè)參數(shù)句携,第三個(gè)參數(shù)等。
新建一個(gè)argument_test.sh允乐,輸入如下內(nèi)容矮嫉。
#! /bin/bash
echo "command is $0"
echo "first argument is $1"
echo "second argument is $2"
echo "third argument is $3"
運(yùn)行結(jié)果:
Bash
$ bash argument_test.sh A B C
command is argument_test.sh
first argument is A
second argument is B
third argument is C
條件語(yǔ)句
正常情況下最好加上條件語(yǔ)句,提高腳本的適用性牍疏。
if [條件]
then
commands
else
comgmands
fi
[條件]可以用bash下的命令蠢笋,例如
# 單個(gè)條件
if grep "pattern" some.file >/dev/null
then
echo "found 'pattern' in some.file"
fi
# 多個(gè)條件
# 或 || ; 與&& ;非 !
if grep 'pattern1' some.file > /dev/null &&
grep 'pattern2' some.file > dev/null
then
echo "found 'pattern1' and 'pattern2' in some.file"
fi
除了bash下的命令外,還可以用`test`或`[]`判斷條件是否成立鳞陨,如下
# -f 判斷是否為文件
if test -f some.file
then
....
fi
# 或[] 記住里面的左右一定要有空格
if [ -f some.file ]
then
....
fi
《鳥(niǎo)叔的Linux的私房菜》第三版的380頁(yè)中提高了許多判斷方式昨寞,一般常用的如下:
| 測(cè)試的標(biāo)志 | 代表意義 |
| ------------ | ------------ |
| -d | 是否為文件夾 |
| -f | 是否為文件 |
| -e | 文件是否存在 |
| -h | 是否為連接 |
| -w | 能否寫(xiě)入 |
| -x | 能否執(zhí)行 |
| str1 = str2 | 字符是否相同 |
| str1 != str2 | 字符是否不相同 |
| -eq | 數(shù)值是否相等 |
| -ne | 數(shù)值是否不等 |
| -lt | 小于 |
| -gt | 大于 |
| -le | 小于等于 |
| -ge | 大于等于 |
一般而言,創(chuàng)建一個(gè)pipline處理文件需要三個(gè)步驟:
選擇目標(biāo)文件
使用指定命令處理目標(biāo)文件
追蹤處理后的輸出文件
而循環(huán)語(yǔ)句就是在選擇目標(biāo)文件后厦滤,用于重復(fù)相同的指令處理目標(biāo)文件援岩,還可以記錄輸出文件。
其中選擇目標(biāo)文件有兩種方式:1. 提供記錄目標(biāo)文件信息的文本掏导,2.從含目標(biāo)文件的文件夾內(nèi)篩選享怀。
方法1:
# 假設(shè)你現(xiàn)在在mbs-2017-4/script下
sample_info=sample.txt
sample_names=($(cut -f 1 "$sample_info" ))
echo "${sample_names[@]}"
BC.fg.reads1 BC.fg.reads2 BC.bg.reads1 BC.bg.reads2
說(shuō)明 ${sample_names[@]}
的表示顯示所有變量?jī)?nèi)容,我們可以選擇特定的元素趟咆,將@
替換成0,1,2,3(以0開(kāi)始)添瓷,此外 ${#sample_names[@]}
表示共有多個(gè)元素梅屉, ${!sample_names[@]}
表示各個(gè)元素的索引。
方法2比較粗暴仰坦,直接利用通配符列出文件履植。
sample_names=$(ls *.fq)
for sample in ${sample_names[@]}
do
- 比對(duì)的參數(shù)需要根據(jù)具體情況修改,
- 要求具有特定的目錄構(gòu)造
- 缺少日志信息輸出悄晃,不利于調(diào)試