Unix外壳 - 在读阵列内容循环 [英] Unix shell - read array content in a for loop

查看:85
本文介绍了Unix外壳 - 在读阵列内容循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的数组:

orlist=""
orlist="T_TAB1 \n"
orlist=$orlist"T_TAB2 \n"
orlist=$orlist"T_TAB3 \n"
orlist=$orlist"T_TAB4 \n"
echo $orlist
arrIdx=0
OLD_IFS=$IFS;
IFS="\n"
for IndixList in ${orlist[@]};
do
     echo $IndxList
     MYDIR[${arraryIndix}]=$IndixList
    (( arraryIndix = $arraryIndix+ 1 ))
done
IFS=$OLD_IFS

我必须做一个SELECT在里面一个Oracle数据库的循环,所以我必须读取标签的$ orlist标签。我试过,但不起作用它由标签将采用全阵列式不卡:

i have to do a SELECT in a oracle db inside a for loop so i have to read the $orlist tab by tab. I've tried this but doesn't work it takes the whole array not tab by tab:

for arraryIndix in ${orlist[@]};
do

  echo "SET HEADING OFF"       >> ${FILEOR_SQL}
  echo "SET TERMOUT OFF"       >> ${FILEOR_SQL}
  echo "SET PAGESIZE 0"        >> ${FILEOR_SQL}
  echo "SET LINESIZE 1000"     >> ${FILEOR_SQL}
  echo "SET FEEDBACK OFF"      >> ${FILEOR_SQL}
  echo "SET TRIMSPOOL ON"      >> ${FILEOR_SQL}
  echo "SPOOL ${FILE_DAT}"     >> ${FILEOR_SQL}
  echo "SELECT * "             >> ${FILEOR_SQL}
  echo "FROM ${orlist[@]}"     >> ${FILEOR_SQL}
  echo "WHERE REP_ARG = 2; "   >> ${FILEOR_SQL}
  echo "SPOOL OFF"             >> ${FILEOR_SQL}
  echo "COMMIT;"               >> ${FILEOR_SQL}
  echo "SET HEADING ON"        >> ${FILEOR_SQL}
  echo "SET TERMOUT ON"        >> ${FILEOR_SQL}
  echo "SET PAGESIZE 14"       >> ${FILEOR_SQL}
  echo "SET FEEDBACK ON"       >> ${FILEOR_SQL}
  echo "SET TRIMSPOOL OFF"     >> ${FILEOR_SQL}
  echo "EXIT;"                 >> ${FILEOR_SQL}

  sqlplus -S -L ${Connection} @${FILEOR_SQL} #connection is a var for connect with `sqlplus`

done

有什么建议?在此先感谢

Any suggestions? Thanks in advance

推荐答案

嗯,你的问题就来了,因为如果你写 \\ n ,它不一定视为一个新的生产线,有人不得不的\\ 的顺序依次 N 翻译为一个换行符。也同样在 IFS =\\ n IFS需要设置的东西将计算得到一个新行,而不是组合\\ N 。另外orlist是一个变量,你还没有使用它作为一个数组,并在for循环,它是不会被视为一个数组。
我做了一些变化,它似乎正常工作

Well your problem came because if you write \n, it's not necessarily treated as a new line, somebody have to translate the sequence of \ followed by n as a newline. also same in IFS="\n" IFS needs to be set to something which evaluates to a newline, not a combination of \ and n. Also orlist is a variable, you have not used it as an array, and at the for loop, it is not going to be treated as an array. I did some changes and it seemed to work fine

#!/usr/local/bin/ksh
orlist=""
orlist="T_TAB1 \n"
orlist=$orlist"T_TAB2 \n"
orlist=$orlist"T_TAB3 \n"
orlist=$orlist"T_TAB4 \n"
echo  $orlist
arrIdx=0
OLD_IFS=$IFS;
IFS=$'\n'
#IFS=""
arraryIndix=0
for IndxList in `echo -e $orlist`
do
     echo "Hello $IndxList "
     MYDIR[${arraryIndix}]=$IndxList
    ((arraryIndix++))
done
IFS=$OLD_IFS
echo "Finally ${MYDIR[@]}"

输出

T_TAB1 \nT_TAB2 \nT_TAB3 \nT_TAB4 \n
Hello T_TAB1
Hello T_TAB2
Hello T_TAB3
Hello T_TAB4
Finally T_TAB1  T_TAB2  T_TAB3  T_TAB4


$ ksh --version
version         sh (AT&T Research) 93t+ 2010-02-02

更新以下意见

FILEOR_SQL=""
func() {
  echo "SET HEADING OFF"       >> ${FILEOR_SQL}
  echo "SET TERMOUT OFF"       >> ${FILEOR_SQL}
  echo "SET PAGESIZE 0"        >> ${FILEOR_SQL}
  echo "SET LINESIZE 1000"     >> ${FILEOR_SQL}
  echo "SET FEEDBACK OFF"      >> ${FILEOR_SQL}
  echo "SET TRIMSPOOL ON"      >> ${FILEOR_SQL}
  echo "SPOOL random     "     >> ${FILEOR_SQL}
  echo "SELECT * "             >> ${FILEOR_SQL}
  echo "FROM $1"               >> ${FILEOR_SQL}
  echo "WHERE REP_ARG = 2; "   >> ${FILEOR_SQL}
  echo "SPOOL OFF"             >> ${FILEOR_SQL}
  echo "COMMIT;"               >> ${FILEOR_SQL}
  echo "SET HEADING ON"        >> ${FILEOR_SQL}
  echo "SET TERMOUT ON"        >> ${FILEOR_SQL}
  echo "SET PAGESIZE 14"       >> ${FILEOR_SQL}
  echo "SET FEEDBACK ON"       >> ${FILEOR_SQL}
  echo "SET TRIMSPOOL OFF"     >> ${FILEOR_SQL}
  echo "EXIT;"
}
orlist=""
orlist="T_TAB1 \n"
orlist=$orlist"T_TAB2 \n"
orlist=$orlist"T_TAB3 \n"
orlist=$orlist"T_TAB4 \n"
echo  $orlist
OLD_IFS=$IFS;
IFS=$'\n'
arraryIndix=0;
for IndxList in `echo -e $orlist`
do
  FILEOR_SQL="testfilesql"$arraryIndix
  func $IndxList
  ((arraryIndix++))
done
IFS=$OLD_IFS

这篇关于Unix外壳 - 在读阵列内容循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆