背景
我正在使用代码质量分析工具(“scc”),它循环遍历我的 Gitlab 存储库并分析其中找到的代码。该工具最初创建一个 SQLite 表,然后在每次循环期间向该 SQLite 表输出一行数据。
我试图在每次循环迭代期间将每行数据写入 SQLite 表后添加一个附加列。我想添加一个变量的内容,该变量随着每次循环迭代而变化,作为附加列的条目。
示例:
循环迭代1:
$存储库=项目1
代码质量分析输出表:
项目 | 文件 | n代码 | n评论 |
---|---|---|---|
黄色 | 黄色.py | 5 | 1 |
添加额外的列和行条目后:
项目 | 文件 | n代码 | n评论 | httpUrlToRepo |
---|---|---|---|---|
黄色 | 黄色.py | 5 | 1 | 项目1 |
循环迭代2:
$存储库=项目2
代码质量分析工具输出并添加条目到附加列后:
项目 | 文件 | n代码 | n评论 | httpUrlToRepo |
---|---|---|---|---|
黄色 | 黄色.py | 5 | 1 | 项目1 |
绿色 | 绿色.py | 6 | 4 | 项目2 |
代码
注意:
repositories
包含通过扫描我的 Gitlab 帐户找到的存储库名称数组。
counter=1
for repository in "${repositories[@]}"; do
echo "Running scc analysis on ${repofolder}."
echo "counter: ${counter}"
if [ "${counter}" -eq "1" ];
then
echo "Creating table and adding data to analysis.db"
scc -f sql --sql-project ${repofolder} ./${repofolder} | sqlite3 analysis.db
sqlite3 analysis.db 'ALTER TABLE t ADD httpUrlToRepo TEXT;'
sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'
else
echo "Inserting data to analysis.db"
scc -f sql-insert --sql-project ${repofolder} ./${repofolder} | sqlite3 analysis.db
sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'
fi
fi
rm -r $repofolder
counter=$((counter+1))
continue
done
逻辑如下:
实际结果
到目前为止我的方法的问题在于在这里的 SQL 语句中使用 $repository 变量
sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;
根据我尝试将变量插入 SQL 语句的方式,要么将字符串“${repository}”添加到列中的所有条目,要么收到解析错误。
到目前为止,我已尝试将变量插入为:
${repository}
、$repository
、"${repository}"
、&repository
和""${repository}""
。
问题
我的问题有两个:
您的错误是,在 bash 中,单引号 不会扩展 shell 变量,因此,例如,您必须替换:
'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'
与
"UPDATE t SET httpUrlToRepo=\"$repository\" WHERE httpUrlToRepo IS NULL;"
然后对所有的陈述重复此操作...
我找到了第二个问题的答案:“如何正确地将 bash 变量注入到 SQL 语句中?”。
就我而言,我需要使用
sqlite3 analysis.db "UPDATE t SET httpUrlToRepo='"$repository"' WHERE httpUrlToRepo IS NULL;"
这将评估以下内容,其中
$repository=project1
:
sqlite3 analysis.db "UPDATE t SET httpUrlToRepo='project1' WHERE httpUrlToRepo IS NULL;"
该语句位于双引号内。单引号用于开始和结束字符串,其中双引号结束并重新打开 SQL 语句并包含变量引用。