如何通过命令行向Bash脚本传参以筛选运行指定文件?
动态匹配字段的Bash脚本解决方案
这问题我太熟了,用命令行参数完全能搞定,既不用写一堆重复的if语句,还能灵活切换要处理的字段!下面是修改后的完整脚本,我会一步步给你解释:
#!/bin/bash # 检查用户是否传入了匹配参数 if [ $# -eq 0 ]; then echo "错误:请传入要匹配的字段参数,比如: $0 hard_FIXED" exit 1 fi # 获取命令行传入的匹配字符串 MATCH_PATTERN="$1" # 初始化计数器 i=0 # 源文件路径(和你原脚本一致) SOURCE_DIR="/home/noor/popGen/sweeps/slim_script/final/*" # 输出目录(和你原脚本一致) OUTPUT_DIR="/home/noor/popGen/sweeps/msOut/final/" for entry in $SOURCE_DIR do # 匹配文件名中包含指定字段的文件 if [[ $entry == *"$MATCH_PATTERN"* ]]; then echo "正在处理文件: $entry" # 运行程序并输出到指定目录,文件名用匹配字段+计数器命名 /home/stuff/build/./test "$entry" > "${OUTPUT_DIR}${MATCH_PATTERN}_$i.txt" # 计数器自增 i=$((i+1)) fi done echo "处理完成!共处理了 $i 个匹配 $MATCH_PATTERN 的文件"
关键部分解释:
- 命令行参数检查:先判断用户有没有传参数,如果没传就提示用法并退出,避免脚本盲目运行。
- 动态匹配字段:用
$1获取用户在命令行输入的第一个参数,比如hard_FIXED或者hard_0,把它存在MATCH_PATTERN变量里,后面的匹配和文件名都用这个变量。 - 统一计数器:不再需要多个
i_hard、i_soft变量,一个i就够了,每次匹配成功就自增。 - 路径变量化:把源目录和输出目录单独存成变量,以后要改路径直接改这两行就行,比硬编码更方便。
使用示例:
比如你想处理所有含hard_FIXED的文件,就这么运行脚本:
./your_script.sh hard_FIXED
想切换成处理soft_FIXED?直接换参数就行:
./your_script.sh soft_FIXED
甚至处理自定义的hard_0字段也没问题:
./your_script.sh hard_0
这样一来,不管你要匹配什么字段,只要在命令行传参数就行,再也不用写一堆重复的if语句啦!
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

