如何在Bash脚本中调用其他文件中的变量?技术求助
求助解答:Bash脚本调用外部变量及SQL查询优化
我已查阅大量同类问题,但未找到可行解决方案,恳请协助。我需在以下Bash脚本中调用其他文件的变量,目前正尝试执行该脚本:
#!/bin/bash for i in {0..10000} do mysql --user=genome --host=genome-mysql.cse.ucsc.edu -A -D hg19 -e ' Select S.name as rsID, S.chrom, S.chromEnd, S.chromStart, K.txStart, K.txEnd, G.geneSymbol, G.kgID from snp138 as S left join knownGene as K on (S.chrom=K.chrom and not(K.txEnd+1000000<S.chromStart or S.chromEnd+1... ' done
针对你的需求,我整理了两种在Bash脚本中调用外部文件变量的实用方法,顺便给你提些SQL执行的优化建议:
一、加载外部文件变量的两种方式
假设你有个存放变量的配置文件(比如命名为db_config.sh),内容像这样:
# db_config.sh DB_USER="genome" DB_HOST="genome-mysql.cse.ucsc.edu" DB_DB="hg19"
1. 用source命令直接加载
这是最常用的方式,在你的脚本开头加上一行,就能直接使用配置文件里的变量:
#!/bin/bash # 加载外部配置文件,替换成你的实际路径 source ./db_config.sh for i in {0..10000} do mysql --user="$DB_USER" --host="$DB_HOST" -A -D "$DB_DB" -e ' Select S.name as rsID, S.chrom, S.chromEnd, S.chromStart, K.txStart, K.txEnd, G.geneSymbol, G.kgID from snp138 as S left join knownGene as K on (S.chrom=K.chrom and not(K.txEnd+1000000<S.chromStart or S.chromEnd+1... ' done
source也可以用简写.,比如./db_config.sh,效果完全一样。
2. 命令行参数传递变量
如果你的变量不需要存在配置文件里,想每次执行脚本时临时传入,就可以用命令行参数:
执行脚本的时候这样传参:
./your_script.sh genome genome-mysql.cse.ucsc.edu hg19
然后脚本里用$1、$2、$3获取对应的变量:
#!/bin/bash # 从命令行参数获取变量 DB_USER="$1" DB_HOST="$2" DB_DB="$3" for i in {0..10000} do mysql --user="$DB_USER" --host="$DB_HOST" -A -D "$DB_DB" -e ' Select S.name as rsID, S.chrom, S.chromEnd, S.chromStart, K.txStart, K.txEnd, G.geneSymbol, G.kgID from snp138 as S left join knownGene as K on (S.chrom=K.chrom and not(K.txEnd+1000000<S.chromStart or S.chromEnd+1... ' done
二、额外的优化建议
- 补全SQL语句:你提供的SQL语句末尾是
S.chromEnd+1...,明显被截断了,一定要补全完整的条件和语句,否则mysql会报错无法执行。 - 优化循环查询:循环10001次去连接数据库,效率非常低,而且可能会被UCSC的数据库限制请求频率。建议尽量把循环的逻辑整合到SQL语句里,一次查询完成任务;如果必须循环,记得在每次循环后加个
sleep 1之类的延迟,避免给数据库造成过大压力。
内容的提问来源于stack exchange,提问作者GB44444
相关产品推荐
相关产品推荐

