- 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 $? 可以输出最近运行程序退出码。
以上代码展示字符与数字之间的比较,具有含义见下表。
表1
然而脚本中更常用的操作是对文件与路径的属性判断,因此test语句自带用于文件判断的参数(详细用法见下表):
# 判断文件夹是否存在
$ test -d some_dirictory
# 判断文件是否存在
$ test -f some_file.txt
# 判断文件是否可读
$ test -r some_file.txt
# 判断文件是否可写
$ test -w some_file.txt
表2
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
这里确定是否参数只有一个且为可读的文件。









网友评论