簡體   English   中英

如何在bash中嵌套變量並循環遍歷子變量

[英]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}語法取消引用它。 假設您事先知道變量名稱(即第一部分始終是c1c2c3 ,第二部分始終是s1s2 ,……),您可以使用以下內容:

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 調用)

我已經使用xyz來強調變量的構造方式,但您可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM