通过封装,可以将常用的代码块或功能模块化,便于在不同的脚本或项目中重复使用,提高开发效率。本文介绍shell脚本的一个简单封装模板,文末附pdf资源赠送。
参数传递
通过封装,可以将一些常变的值作为参数传入,使得脚本更加灵活,适应不同的使用场景。shell脚本可以通过位置参数(如$1
, $2
等)来进行参数传递。其中$1
是第一个参数,$2
是第二个参数,依此类推。$0
通常是脚本本身的名称。$#
表示传递给脚本的参数总数。$@
和$*
表示所有传递给脚本的参数。
#!/bin/bash
# 脚本名:example.sh
echo "脚本名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "参数总数:$#"
echo "所有参数(使用\$*):$*"
echo "所有参数(使用\$@):$@"c
运行该脚本
bash example.sh param1 param2 param3
则输出
脚本名:example.sh
第一个参数:param1
第二个参数:param2
参数总数:3
所有参数(使用$*):param1 param2 param3
所有参数(使用$@):param1 param2 param3
位置参数示例
以下演示创建一个简单shell脚本,用于查找并显示某一个用户的登录信息。
cat >find.sh
#!/bin/sh
#finduser—查看第一个参数指定的用户是否登录
who |grep $1
^D
chmod +x find.sh
/find.sh rna
chmod +x find.sh
修改了find.sh
文件的权限,添加执行(x)权限,使得文件成为可执行脚本。执行find.sh
脚本,传递rna
作为参数,将会检查用户rna
是否登录到系统中。
命名参数
如果你想让脚本更加灵活和易于理解,你可以使用命名参数。这通常需要使用getopts
或手动解析$@
(所有参数的列表)。以下是一个使用手动解析方法来接受命名参数的简化示例:
#!/usr/bin/bash
# 定义使用说明函数
usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " -h, --help 显示帮助信息"
echo " -o, --out_dir PATH 指定结果输出路径"
echo " -s, --outs PATH 指定cellranger atac输出路径,写到outs。ie: gss1/home/2024/batch_2/01.data/Cg/outs"
exit 1
}
# 初始化变量
out_dir=""
outs=""
# 解析命令行参数
while true; do
case "$1" in
-h|--help)
usage
;;
-o|--out_dir)
out_dir="$2"
shift 2
;;
-s|--outs)
outs="$2"
shift 2
;;
--)
shift
break
;;
*)
if [ -n "$1" ]; then
echo "无法识别的选项: $1"
usage
else
break
fi
;;
esac
done
# 检查必要的参数是否已经被传递
if [ -z "$out_dir" ] || [ -z "$outs" ]; then
echo "缺少必要的参数。"
usage
fi
该脚本创建了通过解析命令行参数来接收用户输入的信息。它支持两种参数:-o 或 --out_dir:指定结果输出路径。-s 或 --outs:指定cellranger atac输出路径。
资源分享
转发本公众号任意一篇内容至朋友圈,截图发到一只羊(vx),并备注Linux资源即可,将在当天统一回复。
🔗单细胞测序 、🔗scRNA-seq高级分析、🔗scATAC-seq、 🔗R包开发、🔗源码拆解、 🔗测试、🔗RNA-seq 、🔗其它生信分析、 🔗R语言 、🔗Python 、🔗环境配置 、🔗文献分享 、 🔗一只羊的碎碎念
分享内容:分子标记开发及种质资源鉴定、单细胞多组学数据分析、生信编程、算法原理、文献分享与复现等...
点个赞再走!