[英]How to nest variables and loop through sub-variables in bash
我正在嘗試編寫一個從 mysql 生成 csv 文件的腳本。 來自 mysql 的 csv 文件工作正常,但是,我正在努力尋找一種循環變量的方法,或者將它們視為要循環的數組。
一些示例變量如下
c1="Client 1"
c1_s1_name=Alpha
c1_s1_id=761967
c1_s2_name=Beta
c1_s2_id=415612
c2="Client 2"
c2_s1_name=XYZ
c2_s1_id=438976
c2_s2_name=ABC
c2_s2_id=982012
c3="Client 3"
c3_s1_name=No-Name
c3_s1_id=347654
c3_s2_name=House
c3_s2_id=109321
然后我有一些准代碼嘗試為每個client
運行一個 sql 腳本,如下所示
# loop through all clients
for all_clients in $c1 $c2 $c3
do
# and then loop through for all survey names and all survey ids for each seperate client
for survey_name in $*_name and survey_id in $*_id
do
mysql -h "localhost" -u "root" "$DATABASE" -e "SELECT count(*) FROM $survey_id" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $all_clients-$survey_name-filename-count.csv
done
done
我不確定如何設置腳本,以便c1
變量作為一個集合運行,然后是c2
,然后是c3
。 我猜數組可能是我需要的,但我不確定?
我也遇到了下面的答案,但它是針對 PHP 的,盡管它看起來很像 bash ......
您需要構建動態變量的名稱,然后使用{!var}
語法取消引用它。 假設您事先知道變量名稱(即第一部分始終是c1
、 c2
或c3
,第二部分始終是s1
或s2
,……),您可以使用以下內容:
for x in c1 c2 c3; do
for y in s1 s2; do
for z in name id; do
xyz=${x}_${y}_${z}
# Use ${!xyz} to get the contents of the variable
done
done
done
示例(但顯然沒有您的 mysql 調用)
我已經使用x
、 y
和z
來強調變量的構造方式,但您可以將x
替換為all_clients
等。
如果事先不知道c*
和s*
的數量,您可以使用稍微更高級的技術。
numc=3
nums=2
for x in $(seq -f 'c%g' $numc); do
for y in $(seq -f 's%g' $nums); do
for z in name id; do
xyz=${x}_${y}_${z}
# Use ${!xyz} to get the contents of the variable
done
done
done
這里的魔法來自seq
。 例如,在以下調用中:
seq -f 'c%g' $numc
$numc
選項表示您想從1
迭代到$numc
。 -f 'c%g'
選項表示您想要形成一個類似printf
的字符串,在這種情況下,字母c
后跟數字值。 所以,上面的例子會寫:
c1
c2
c3
整個字符串由$()
捕獲,這意味着輸出將內聯在您的腳本中。 總而言之,以下行:
for x in $(seq -f 'c%g' $numc); do
將被解釋為:
for x in c1 c2 c3; do
這等效於初始for
循環,不同之處在於現在您可以控制迭代次數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.