2014-10-16 26 views
0

credentials文件像這樣的:節省變量,供以後使用(bash)的

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 

回答

2

你並不需要一個循環都:

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

正是我即將發佈的內容。這對我來說是最直觀的解決方案。 – joepd 2014-10-16 19:35:35

+1

迄今爲止最好的回答! – branquito 2014-10-16 19:53:54

+1

你是對的,我想因爲我已經接受了另一個,但這個解決方案是如此的優雅.. – branquito 2014-10-16 19:56:43

2

相反,它重定向到管道,你可以做的:

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

現在即使在循環退出後,數組c也可用。

但是,你可以直接從文件credentials而不是使用awk解讀爲你似乎可以用awk僅分裂線,你可以在bash本身:

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

,不要使用管道因爲它創建了一個子進程,並且在其下創建的所有變量在父shell中將不可用。使用過程中,而不是替代:

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

謝謝,鑑於您的解決方案與@Blue Moon的解決方案非常相似,我將他的答案標記爲已接受,因爲他幾秒鐘後可以更快地發佈海報:) – branquito 2014-10-16 18:28:30

+1

不同之處在於[命令替換vs過程替換](http:/ /stackoverflow.com/questions/15416570/command-substitution-vs-process-substitution) – anubhava 2014-10-16 18:33:18

+0

我知道,你有'fd'來代替'<(...)',bellow是執行給出行的命令在閱讀的時候,把'herestring'作爲一行,你的方法是否更快,或者更好些? – branquito 2014-10-16 18:35:57

1

你可能只是在做AWK整個事情:

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

是的,我在這裏發佈我的問題後也想到了這一點。很好的解決方案,使用END塊和系統調用 – branquito 2014-10-16 18:17:38

+0

但是你修剪了我的條件語句,那'credentials'文件比這三行更多;)哦,我現在看到它會繼續工作,因爲關聯數組,抱歉。 – branquito 2014-10-16 18:18:40

+0

文件中多餘的行不應該引起任何問題。說實話,我認爲在簡單地將文件解析爲變量時,這些方法都沒有多大優勢。 – 2014-10-16 18:23:51

0

credentials.txt(文本文件):

db: db_name 
user: username 
password: password 

您可以將var iables in 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用戶名-p密碼DB_NAME < file.sql

然後將它傳遞給shell執行查詢。