我有一个函数,它读取一个名称列表,并将其用作另一个命令的输入,如下所示:
runMain() {
getName=$(PGPASSWORD=$_clpw1 psql -h myendpoint.com -U ops_readonly -d dev -p 5439 -t -c "select datname from pg_database where datname not like 'template%' and datname not like 'tealium%' and datname not like 'padb%' and datname not like 'services%' and datname not like 'sales%' and datname not like 'dev%' and datname not like 'demo_%' and datname not like '%_demo' and datname not like 'nt_%';")
echo "${getName}" >> "${_file}"
for db in $(cat "${_file}");
do
getSchema=$(PGPASSWORD=$_clpw2 psql -h myendpoint.com -U masteruser -d "${db}" -p 5439 -t -c "select distinct 'GRANT SELECT ON ALL TABLES IN SCHEMA ' || table_schema ||' TO ops_readonly;' FROM information_schema.tables where table_catalog='%${db}%' and table_schema not in ('pg_catalog','information_schema');")
echo "${getSchema}" >> "${_script}"
done
}
我执行了echo "${getSchema}" >> "${_script}"
,因此我可以将查询结果输出到文件中。
我可以看到输出文件已被触及,它的状态为32k,但文件为空。
我已经分别测试了命令行字符串,它可以工作,我得到了我期望的输出。
有没有更好的方法将输出捕获到文件?我错过了什么?谢谢。
答案 0 :(得分:1)
您的文件为空(填充了32k的空白行),因为${getName}
和${getSchema}
都是空的。因此,问题出在那些psql
命令中。
将{1}}中的一个双引号放在一边是可以的(不要紧,因为这样会突显混乱),所以你可以这样做:
"$(…)"
除了引用您的命令替换之外,我还引用了您的密码(如果您的密码中包含空格或其他非单词字符,这非常重要!)。最后,我给你的命令runMain() {
getName="$(PGPASSWORD="$_clpw1" psql -h myendpoint.com -U ops_readonly -d dev -p 5439 -t -c "select datname from pg_database where datname not like 'template%' and datname not like 'tealium%' and datname not like 'padb%' and datname not like 'services%' and datname not like 'sales%' and datname not like 'dev%' and datname not like 'demo_%' and datname not like '%_demo' and datname not like 'nt_%';" 2>&1)"
echo "${getName}" >> "${_file}"
for db in $(grep -o '[[:alnum:].-][[:alnum:].-]*' "${_file}");
do
getSchema="$(PGPASSWORD="$_clpw2" psql -h myendpoint.com -U masteruser -d "${db}" -p 5439 -t -c "select distinct 'GRANT SELECT ON ALL TABLES IN SCHEMA ' || table_schema ||' TO ops_readonly;' FROM information_schema.tables where table_catalog='%${db}%' and table_schema not in ('pg_catalog','information_schema');" 2>&1)"
echo "${getSchema}" >> "${_script}"
done
}
将标准错误转换为标准输出,这样就可以在输出文件中捕获它,这可能会显示其他问题(如密码错误或连接错误)。
grep命令使for循环安全执行,确保输入仅限于一个或多个字母数字字符,点和连字符。
答案 1 :(得分:0)
创建了一个输出文件。我刚收到0个结果。我的问题的根源在于plsql查询。通过命令行运行它,如果使用'%${db}%'
运行对postgres的查询,我使用like
是有效的,因为我没有使用like
,所以将周围的%
移除到{{ 1}}产生了我的输出。