歡迎關(guān)注微信公眾號(hào)生信寶典:https://mp.weixin.qq.com/s/lWNp_6W_jLiogmtlk9nO2A
本篇是我最開始學(xué)習(xí)Linux
命令時(shí)看的一篇帖子吧彪,最早見于ChinaUnix
(這次查找其出處時(shí)發(fā)現(xiàn)2002年就有這篇)思劳。學(xué)習(xí)過程中熊杨,轉(zhuǎn)載到我的博客,遇到問題就查一下冠桃。這次看到蛾扇,把格式整理了,部分內(nèi)容做了校對(duì)舶赔,增加了解釋和示例,分享于此谦秧,也是對(duì)之前16篇Linux
入門和生物信息常用Linux命令文章 (包括最基礎(chǔ)操作竟纳、環(huán)境變量、可執(zhí)行屬性油够,命令行運(yùn)行監(jiān)測(cè)蚁袭、常見錯(cuò)誤、快捷操作石咬、管道、標(biāo)準(zhǔn)輸入輸出卖哎、軟件安裝鬼悠、Docker、Conda亏娜、定期備份焕窝、配置信息查詢、awk维贺、sed它掂、vim)的補(bǔ)充。
Bash特殊字符
- 通配符:
*
: 匹配任何字符
**
: 匹配任何字符串
*?
: 匹配任何單個(gè)字符
- 集合運(yùn)算符
用一些單個(gè)字溯泣、一個(gè)連續(xù)范圍或斷續(xù)的字符集合作為通配符
[a-z]
: 用字符集合作通配符匹配單個(gè)字符, 如: [aeiou]
, [a-o]
, [A-Z]
, [0-9]
[!A-Za-z0-9]
: 除了集合外的所有字符組成的集合作通配符
- 花括號(hào)展開式(可以嵌套):
c{a{r,t,n}, b{r,t,n}}s
可以匹配cars
cats
cans
cbrs
cbts
cbns
- 其它特殊字符:
()
: 子shell運(yùn)行虐秋;比如 (cd ehbio; mdkir ysx)
進(jìn)入ehbio
目錄,新建ysx
文件夾垃沦,運(yùn)行完之后還在當(dāng)前目錄客给。
'
: 強(qiáng)引用字符串, 不解釋特殊字符
"
: 弱引用字符串, 解釋所有特殊字符
;
: 命令分隔符(命令終止符), 運(yùn)行在一行里執(zhí)行多條命令;一般在終端直接寫判斷語(yǔ)句或執(zhí)行for
循環(huán)時(shí)用。
#
: 行注釋
$
: 變量表達(dá)式肢簿,變量解析
&
: 在后臺(tái)執(zhí)行命令靶剑,在for
循環(huán)中也可用作命令分割符,取代done
前面的;
Bash變量
- 自定義變量
用戶自定義的變量由字母池充、數(shù)字和下劃線組成, 并且變量名的第一個(gè)字符不能為數(shù)字, 且變量名大小寫敏感桩引。
varname=value
注意bash不能在等號(hào)兩側(cè)留空格
shell語(yǔ)言是非類型的解釋型語(yǔ)言, 給一個(gè)變量賦值實(shí)際上就是定義了變量, 而且可以賦不同類型的值。引用變量有兩種方式, $varname和${varname}, 為防止變量在字符串中產(chǎn)生歧義建議使用第二種方式, 引用未定義的變量其值為空收夸。
ct@ehbio:~$ a="EHBIO"
ct@ehbio:~$ echo ${a}
EHBIO
ct@ehbio:~$ echo $a
EHBIO
#出錯(cuò)了
ct@ehbio:~$ echo $agood
#引用變量時(shí)大括號(hào)的作用
ct@ehbio:~$ echo ${a}good
EHBIOgood
ct@ehbio:~$ echo $a.good
EHBIO.good
#出錯(cuò)了
ct@ehbio:~$ echo $a_good
#引用變量時(shí)大括號(hào)的作用
ct@ehbio:~$ echo ${a}_good
EHBIO_good
為了使變量可以在其它進(jìn)程中使用, 需要將變量導(dǎo)出: export varname
- 環(huán)境變量
可以用set
命令給變量賦值或查看環(huán)境變量值, 使用unset
命令清除變量值, 使用export
導(dǎo)出變量將可以使其它進(jìn)程訪問到該環(huán)境變量坑匠。可以把設(shè)置保存到.bashrc
或.bash_profile
中, 成為永久的環(huán)境變量咱圆。
環(huán)境變量不限于我們之前講過的可執(zhí)行程序的環(huán)境變量笛辟、動(dòng)態(tài)庫(kù)功氨、Python模塊的環(huán)境變量,任何變量都可以的手幢。
- 位置變量
位置變量對(duì)應(yīng)于命令行參數(shù), 其中$0
為腳本名稱, $1
為第一個(gè)參數(shù), 依次類推, 參數(shù)超過9個(gè)必須使用${}
引用變量捷凄。shell保留這些變量, 不允許用戶以另外的方式定義它們, 傳給腳本或函數(shù)的位置變量是局部和只讀的, 而其余變量為全局的(可以用local關(guān)鍵字聲明為局部)。
- 其它變量
$?
: 保存前一個(gè)命令的返回碼; 0
為運(yùn)行成功围来,常用來判斷上一個(gè)程序的退出狀態(tài)跺涤。
$$
: 當(dāng)前shell的進(jìn)程號(hào)
$!
: 上一個(gè)子進(jìn)程的進(jìn)程號(hào)
$#
: 傳給腳本或函數(shù)的參數(shù)個(gè)數(shù), 即位置變量數(shù)減1
(1代表腳本自身)
$*
和$@
: 傳給腳本的所有參數(shù)(不包含腳本本身), 每個(gè)參數(shù)以$IFS
分隔(一般內(nèi)為空格\TAB\換行); 兩者的不同點(diǎn)是引號(hào)括起來時(shí),$*
會(huì)被作為一個(gè)整體监透,$@
還是單個(gè)的參數(shù)桶错。
ct@ehbio:~$ cat ehbio_testParam.sh
#!/bin/bash
echo "EHBIO${IFS}great"
echo '$*'
echo -ne "\t";
echo $*
echo '$@'
echo -ne "\t";
echo $@
echo 'Each element in $*:'
for i in "$*"; do
echo -ne "\t";
echo $i;
done
echo 'Each element in $@:'
for i in "$@"; do
echo -ne "\t";
echo $i;
done
ct@ehbio:~$ bash ehbio_testParam.sh sheng xin bao dian
EHBIO
great
$*
sheng xin bao dian
$@
sheng xin bao dian
Each element in $*:
sheng xin bao dian
Each element in $@:
sheng
xin
bao
dian
Bash操作符
- 字符串操作符(替換操作符)
${var:-word}
: 如果var存在且不為空, 返回它的值, 否則返回word
${var:=word}
: 如果var存在且不為空, 返回它的值, 否則將word賦給var, 返回它的值
${var:+word}
: 如果var存在且不為空, 返回word, 否則返回空
${var:?message}
如果var存在且不為空, 返回它的值,
否則顯示“-bash: var: message”, 然后退出當(dāng)前命令或腳本
${var:offset[:length]}
從offset位置開始返回var的一個(gè)長(zhǎng)為length的子串,
若沒有l(wèi)ength, 則默認(rèn)到var串末尾
ct@ehbio:~$ echo ${var:?message}
-bash: var: message
ct@ehbio:~$ var='sheng xin bao dian'
ct@ehbio:~$ echo ${var:6:3}
xin
ct@ehbio:~$ echo ${var:?message}
sheng xin bao dian
ct@ehbio:~$ echo $?
0
ct@ehbio:~$ unset var
ct@ehbio:~$ echo ${var:?message}
-bash: var: message
ct@ehbio:~$ echo $?
1
ct@ehbio:~$ echo ${var:=ehbio}
ehbio
ct@ehbio:~$ echo ${var}
ehbio
- 模式匹配操作符
${var#pattern}
從var頭部開始, 刪除和pattern匹配的最短模式串, 然后返回 剩余串
${var##pattern}
從var頭部開始, 刪除和pattern匹配的最長(zhǎng)模式串, 然后返回 剩余串, basename path=${path##*/}
${var%pattern}
從var尾部開始, 刪除和pattern匹配的最短模式串, 然后返回 剩余串, dirname path=${path%/*}
${var%%pattern}
從var尾部開始, 刪除和pattern匹配的最長(zhǎng)模式串, 然后返回 剩余串
${var/pattern/string}
用string替換var中和pattern匹配的最長(zhǎng)模式串
個(gè)人最常用的是最后一個(gè),常用于for
循環(huán)中胀蛮。
ct@ehbio:~$ var='sheng xin bao dian good'
ct@ehbio:~$ ${var/good/great}
-bash: sheng: command not found
ct@ehbio:~$ echo ${var/good/great}
sheng xin bao dian great
比如獲取fastq文件的名字部分
for i in `ls *_1.fq.gz`; do j=${i/_1.fq.gz/}; echo "$j"; done
Shell中條件和test命令
Bash可以使用[ … ]
結(jié)構(gòu)或test
命令測(cè)試復(fù)雜條件
格式: [ expression ]
或 test expression
返回一個(gè)代碼, 表明條件為真還是為假, 返回0
為真, 否則為假院刁。
注: 左括號(hào)后
和右括號(hào)前空格
是必須的語(yǔ)法要求
- 文件測(cè)試操作符
-d file
: file存在并且是一個(gè)目錄
-e file
: file存在
-f file
: file存在并且是一個(gè)普通文件
-g file
: file存在并且是SGID(設(shè)置組ID)文件
-r file
: 對(duì)file有讀權(quán)限
-s file
: file存在并且不為空
-u file
: file存在并且是SUID(設(shè)置用戶ID)文件
-w file
: 對(duì)file有寫權(quán)限
-x file
: 對(duì)file有執(zhí)行權(quán)限, 如果是目錄則有查找權(quán)限
-O file
: 擁有file
-G file
: 測(cè)試是否是file所屬組的一個(gè)成員
-L file
: file為符號(hào)鏈接
file1 –nt file2
: file1比file2新
file1 –ot file2
: file1比file2舊
舉兩個(gè)例子
ct@ehbio:~$ touch older
ct@ehbio:~$ touch newer
ct@ehbio:~$ if test -e older; then echo "older esists"; fi
older esists
ct@ehbio:~$ if test -s older; then echo "older is unempty"; fi
ct@ehbio:~$ if [ -s older ]; then echo "older is unempty"; fi
ct@ehbio:~$ if [ ! -s older ]; then echo "older is empty"; fi
older is empty
ct@ehbio:~$ if [ newer -nt older ]; then echo "newer"; fi
newer
- 字符串操作符
str1=str2
str1和str2匹配
str1!=str2
str1和str2不匹配
str1>str2
str1大于str2
-n str
str的長(zhǎng)度大于0(不為空)
-z str
str的長(zhǎng)度為0(空串),常用于判斷必須的命令行參數(shù)是否傳入
# 字符串的大小比較的是最先遇到的不同的ASCII碼的大小
ct@ehbio:~$ if test "10">"20"; then echo "10>20"; fi
10>20
ct@ehbio:~$ if test 10>20; then echo "10 < 20"; fi
- 整數(shù)操作符
var1 –eq var2 var1等于var2
var1 –ne var2 var1不等于var2
var1 –ge var2 var1大于等于var2
var1 –gt var2 var1大于var2
var1 –le var2 var1小于等于var2
var1 –lt var2 var1小于var2
ge
: great equal; gt
: great than
需要注意的是常用的數(shù)學(xué)運(yùn)算符給了字符串比較粪狼,數(shù)字比較使用的卻是英文縮寫
數(shù)學(xué)表達(dá)式也可以
if (( 3>2 )); then echo 'TRUE'; fi
TRUE
- 邏輯操作符
!expr
對(duì)expr求反
expr1 && expr2
對(duì)expr1與expr2求邏輯與, 當(dāng)expr1為假時(shí)不再執(zhí)行expr2
expr1 || expr2
對(duì)expr1與expr2求邏輯或, 當(dāng)expr1為真時(shí)不再執(zhí)行expr2
Shell流控制
- 條件語(yǔ)句: if
if
, then
, elif
, else
, fi
是關(guān)鍵詞退腥,其它的是需要替換掉的。
if conditions; then
do sth when conditions are true
elif another_conditions; then
do sth when another_conditions are true
else:
do sth when above condiitons are all false
fi
if test $guanzhu_sxbd == "already"; then
echo "Enjoy it"
elif test $guanzhu_hjyz == "already"; then
echo "Enjoy it"
else
echo "Guan zhu them"
fi
Enjoy it
- 確定性循環(huán):
for do done
常用的批量操作方式
遍歷一個(gè)列表再榄,取出每個(gè)元素狡刘,針對(duì)性操作。
for i in `ls *_1.fq.gz`; do
echo "$i";
done
- 不確定性循環(huán):
while
和until
declare -i a #定義整數(shù)變量
a=1 # 初始化變量
while test $a -lt 3; do
echo $a
a=$a+1
done
echo $a
- 選擇結(jié)構(gòu):
case
和select
(類似getopts)
ct@ehbio:~$ cat select_case.sh
PS3="Input the position of selected parameter (1 for exit):"
select opts in a b c d
do
case $opts in
a)
exit 0;
;;
b)
echo " Parameters $opts"
;;
c)
echo " Parameters $opts"
;;
d)
echo " Parameters $opts"
;;
?)
echo "Unknown"
;;
esac
done
ct@ehbio:~$ bash select_case.sh
1) a
2) b
3) c
4) d
Input the position of selected parameter (1 for exit):2
Parameters b
Input the position of selected parameter (1 for exit):3
Parameters c
Input the position of selected parameter (1 for exit):4
Parameters d
Input the position of selected parameter (1 for exit):1
- 命令
shift
將存放在位置變量中的命令行參數(shù)依次向左傳遞shift n
命令行參數(shù)向左傳遞n
個(gè)參數(shù)串
ct@ehbio:~$ cat ehbio_testParam.sh
#!/bin/bash
echo 'Each element in $*:'
for i in "$*"; do
echo -ne "\t";
echo $i;
done
echo $1
shift
for i in "$*"; do
echo -ne "\t";
echo $i;
done
ct@ehbio:~$ bash ehbio_testParam.sh sheng xin bao dian
Each element in $*:
sheng xin bao dian
sheng
xin bao dian
Shell函數(shù)
function function_name () { function body}
定義函數(shù)困鸥,函數(shù)參數(shù)的獲取同命令行參數(shù)獲取嗅蔬。
ct@ehbio:~$ cat test_func.sh
function show_ehbio () {
echo $@
echo $1
}
show_ehbio "EHBIO great" "SXBD great"
ct@ehbio:~$ bash test_func.sh
EHBIO great SXBD great
EHBIO great
輸入輸出
- I/O重定向
管道、標(biāo)準(zhǔn)輸入輸出之前有過詳細(xì)介紹疾就。
<
: 輸入重定向
>
: 輸出重定向(沒有文件則創(chuàng)建, 有則覆蓋)
>>
: 輸出重定向(沒有則創(chuàng)建, 有則追加到文件尾部)
<<
: 輸入重定向(here文檔)
command << label
input…
label
說明: 使一個(gè)命令的輸入為一段shell腳本(input…), 直到標(biāo)號(hào)(label)結(jié)束
ftp: USER=anonymous
PASS=YC@163.com
#-i: 非交互模式 -n: 關(guān)閉自動(dòng)登錄
ftp –i –n << END
open ftp.163.com
user $USER $PASS
cd /pub
close
END
#END標(biāo)記輸入結(jié)束
- 字符串I/O操作
字符串輸出: echo
命令選項(xiàng): -e
: 啟動(dòng)轉(zhuǎn)義序列 -n
: 取消輸出后換行 (前面已經(jīng)用到過)
- 字符串輸入:
read
可以用于用戶交互輸入, 也可以用來一次處理文本文件中的一行
命令選項(xiàng):
ct@ehbio:~$ read -p "Enter the best tutorial: " tutorial
Enter the best tutorial: Sheng Xin Bao Dian
ct@ehbio:~$ echo $tutorial
Sheng Xin Bao Dian
# 隱藏輸入內(nèi)容
ct@ehbio:~$ read -s -p "Enter your password: " password
Enter your password:
ct@ehbio:~$ echo $password
haha
命令行處理 命令行處理命令:
getopts
有兩個(gè)參數(shù), 第一個(gè)為字母和冒號(hào)組成的選項(xiàng)列表字符串, 第二個(gè)為一個(gè)變量名
選項(xiàng)列表字符串以冒號(hào)開頭的選項(xiàng)字母排列組成, 如果一選項(xiàng)需要一個(gè)參數(shù)則該選項(xiàng)字母后跟一個(gè)冒號(hào)
getopts
分解第一參數(shù), 依次將選項(xiàng)摘取出來賦給第二個(gè)參數(shù)變量
如果某選項(xiàng)有參數(shù), 則讀取參數(shù)到內(nèi)置變量OPTARG
中 內(nèi)置變量OPTIND
保存著將被處理的命令行參數(shù)(位置參數(shù))的數(shù)值選項(xiàng)列表處理完畢getopts
返回1
, 否則返回0
如:
在我們推出的一步繪圖腳本里面澜术,就是使用Bash
封裝的R腳本,通過修改命令行參數(shù)虐译,完成熱圖瘪板、柱狀圖、線圖漆诽、Venn圖侮攀、火山圖、泡泡圖等圖形的繪制和定制厢拭。
while getopts "hf:m:a:A:b:I:t:x:l:j:J:d:F:G:H:P:L:y:V:D:c:C:B:X:Y:R:w:u:r:o:O:s:S:p:z:Z:v:e:E:i:" OPTION
do
case $OPTION in
h)
usage
exit 1
;;
f)
file=$OPTARG
;;
m)
melted=$OPTARG
;;
.
.
.
?)
usage
exit 1
;;
esac
done
進(jìn)程和作業(yè)控制
命令行運(yùn)行監(jiān)測(cè)和軟件安裝文中講述了部分監(jiān)測(cè)命令兰英。
如果一個(gè)命令需要運(yùn)行比較久,一般使用nohup cmmand &
來放入后臺(tái)不中斷運(yùn)行供鸠,這樣推出終端也不影響程序畦贸。
command &
是把程序放入后臺(tái)。
jobs
: 查看后臺(tái)進(jìn)程
bg
: 顯示后臺(tái)進(jìn)程, 即用Ctrl+z掛起或‘命令 &’執(zhí)行的進(jìn)程
fg job_id
: 將后臺(tái)進(jìn)程轉(zhuǎn)到前臺(tái)執(zhí)行
kill –9 process_id
: 強(qiáng)制殺掉某個(gè)進(jìn)程