保存从awk获取的变量,供以后使用(bash)

时间:2014-10-16 18:02:25

标签: bash shell awk

拥有像这样的credentials个文件:

db: db_name
user: username
password: password

运行此命令后:

awk '$1 ~ /db:|user:|password:/ { print $2 }' credentials \
| while read line; do c+=($line); done;

,我不可能回显我的${c[@]}数组,因为管道进程已经终止,变量就消失了。在while循环终止后,如何设置保存,以便我可以使用该c数组的元素作为凭据,例如在以下命令中:

mysql -u ${c[1]} -p${c[2]} ${c[0]} < file.sql

5 个答案:

答案 0 :(得分:3)

不要使用管道,因为它会创建一个子流程,并且在其下创建的所有变量都不会在父shell中可用。改为使用流程替换:

while read -r line; do 
    c+=($line)
done < <(awk '$1 ~ /db:|user:|password:/ { print $2 }' credentials)

答案 1 :(得分:2)

不是将其重定向到管道,而是可以:

while read line; do 
  c+=($line)
done <<<"$(awk '$1 ~ /db:|user:|password:/ { print $2 }' credentials)"

现在,即使退出循环,数组c仍然可用。

但是,您可以直接从文件credentials中读取,而不是使用awk,因为您似乎仅使用awk来分割该行,您可以在bash中进行分割:< / p>

while read line; do 
  line=${line##*:}
  c+=($line)
done <credentials

答案 2 :(得分:2)

你根本不需要循环:

$ c=( $( awk '$1 ~ /db:|user:|password:/ { print $2 }' file ) )
$ echo "${c[0]}"
db_name
$ echo "${c[1]}"
username
$ echo "${c[2]}"
password

答案 3 :(得分:1)

你可以用awk完成整个事情:

$ awk -F ': ' '{a[$1]=$2}END{system("echo mysql -u " a["user"] " -p" a["password"] " " a["db"] " < file.sql")}' file

答案 4 :(得分:0)

credentials.txt(文本文件):

db: db_name
user: username
password: password

您可以在awk中分配变量 - 然后在处理凭证文件(或stdin)中的所有行之后,打印出要运行的命令并将其传送到shell以执行它。

cat credentials.txt|awk '/db/{db=$2} /username/{username=$2} /password/{password=$2} \
END{print "mysql -u "username" -p "password" "db" < file.sql"}' |sh

那将打印:     mysql -u username -p password db_name&lt; file.sql

然后将其传递给shell并执行查询。