拥有像这样的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
答案 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并执行查询。