- 74.《Bioinformatics Data Skills》之
- 28.《Bioinformatics-Data-Skills》之
- 18.《Bioinformatics-Data-Skills》之
- 19.《Bioinformatics-Data-Skills》之
- 【shell笔记>生信|专项】生信数据处理技能手札(3):
- Bioinformatics Data Skills
- 17.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 23.《Bioinformatics-Data-Skills》之
bash中条件语句的基本格式为:
if [条件命令]
then
[if块]
else
[else块]
fi
条件命令可以为程序,pipeline或test
语句,唯有0退出码为真,其它值皆为假。if判断为真则执行“if块”,否则执行“else块”(else块非必需)。then
可以和"if块"写作一行(需要";"隔开,即if[commands]; then
)。
程序作为条件
可以使用程序作为条件命令,例如grep
能够匹配内容的话会其返回退出码0,判断文件是否存在"pattern":
if grep "pattern" some_file.txt > /dev/null
then
echo "pattern" found in some_file.txt
fi
注:这里通过>/dev/null
重定向避免在屏幕打印返回值。
可以使用逻辑符号&&
(与),||
(或),!
(非)追加判断,例如判断是否两个文件都有“pattern”:
if grep "pattern" some_file.txt > /dev/null && grep "pattern" some_file2.txt > /dev/null
then
echo "pattern" found in some_file.txt and some_file2.txt
fi
判断文件是否不包含“pattern”:
if ! grep "pattern" some_file.txt > /dev/null
then
echo did not find "pattern" in some_file.txt
fi
test语句作为条件
test
命令接条件表达式,返回代表真假的退出码:
$ test "ABC" = "ABC"; echo $?
0
$ test "ABC" = "abc"; echo $?
1
$ test 3 -gt 1; echo $?
0
$ test 3 -le 1; echo $?
1
注:通过; echo $?
可以输出最近运行程序退出码。
以上代码展示字符与数字之间的比较,具有含义见下表。

然而脚本中更常用的操作是对文件与路径的属性判断,因此test
语句自带用于文件判断的参数(详细用法见下表):
# 判断文件夹是否存在
$ test -d some_dirictory
# 判断文件是否存在
$ test -f some_file.txt
# 判断文件是否可读
$ test -r some_file.txt
# 判断文件是否可写
$ test -w some_file.txt

if
组合test
语句格式:
if test -f some_file.txt
then
[...]
fi
可以简略的写作:
if [ -f some_file.txt ]
then
[...]
fi
注:这里[]
需要空格隔开内容。
值得注意的是,test
语句时追加判断采用参数-a
(AND)与-o
(OR)而非&&
和||
,以判断输入的合法性代码作为例子说明:
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 1 -o ! -r $1 ]
then
echo "使用方法:script.sh input.txt"
exit 1
fi
这里确定是否参数只有一个且为可读的文件。
网友评论