bash脚本 - 函数输出结果为空文件

时间:2018-03-08 16:24:46

标签: bash shell unix

我有一个函数,它读取一个名称列表,并将其用作另一个命令的输入,如下所示:

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,但文件为空

我已经分别测试了命令行字符串,它可以工作,我得到了我期望的输出。

有没有更好的方法将输出捕获到文件?我错过了什么?谢谢。

2 个答案:

答案 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}}产生了我的输出。