【问题标题】:Bourne shell - make a loop for each element in an array?Bourne shell - 为数组中的每个元素创建一个循环?
【发布时间】:2013-05-15 13:33:30
【问题描述】:

这是我的数组:

ListTabs=""
ListTabs=$ListTabs"T_Tab1\n"
ListTabs=$ListTabs"T_Tab2\n"
ListTabs=$ListTabs"T_Tab3"   
echo $ListTabs
arrArr=0
OLD_IFS=$IFS;
IFS=\n
for listArr in ${ListTabs[@]}; 
do 
     #echo $listArr
     MYDIR[${ARR}]=$listArr
     (( arrIdx = $ARR+ 1 ))
done
IFS=$OLD_IFS;

然后,我以这种方式从选择中完成了一种 id(FILESELECT_DAT 是查询的输出文件):

sort -u ${FILESELECT_DAT} > ${SORT_OUT1}

好的..现在我必须创建一个循环,为数组的每个元素创建一个 SELECT,其中 ID = ${SORT_OUT1} 的值。所以有2个循环。 ID 上的 while 和 select 的 for 循环。如何在 ${SORT_OUT1} 中循环 ID?我想这是开始

id=""
while read $id
do
for ListTabs in ${listArr}
do 
-
-
SELECT * FROM $ListTabs(but the results is alway the first tab in each loop)
WHERE ID = ${id}(but he show me all IDs)
-
-
done < ${SORT_OUT1}

有什么想法吗?谢谢

【问题讨论】:

  • ListTabs 不是数组。这是一个字符串。整个第一块代码可以替换为listArr=( T_Tab{1,2,3} )

标签: arrays loops sh


【解决方案1】:
listArr=( T_Tab{1,2,3} )
sort -u "$FILESELECT_DAT" > "$SORT_OUT1"
while read id; do
    for ListTabs in "${listArr[@]}"; do
     ...
    done
done < "$SORT_OUT1"

注意for-loop 的主体中没有任何内容从标准输入中读取,否则它将消耗用于read 命令的部分输入。为了安全起见,请使用单独的文件描述符:

while read -u 3 id; do
...
done 3< "$SORT_OUT1"

【讨论】:

  • 这是一个 bourn shell,所以这是我认为制作数组的唯一方法。您的解决方案出现错误。即使在“done 3
  • 您将问题标记为bash,而不是sh
  • 是的,你是对的,抱歉,我同时使用了 bash 和 sh,我把它们弄糊涂了。然而,是 sh。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2015-11-09
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多