【问题标题】:shell read and pass mulptiple variables in for or while loopshell 在 for 或 while 循环中读取并传递多个变量
【发布时间】:2020-11-11 10:03:31
【问题描述】:

下面是我的输入文件和我正在使用的代码 文件:

cat $TESTFILE
2020-01-13,COST_CH_RPT
2018-04-19,LOSS_CH_RPT

代码:

for i in `cat $TESTFILE`
do
   export date=`cat $TESTFILE|cut -d',' -f1`
      echo date=$date
   export Name=`cat $TESTFILE|cut -d',' -f2`
      echo Name=$Name
beeline --outputformat=csv2 --hivevar Name=$Name --hivevar date=$date  -u ${beeURL} -f TEST.hql
done

目标是为文件中的每一行运行 hql 文件,上面的代码为可用的两行运行了两次,但是为两次运行传递的变量是相同的,即第一行在文件中。 如何区分每次运行的输入变量。

【问题讨论】:

  • 我相信很快就会有人发现一个重复的问题,但与此同时:mywiki.wooledge.org/BashFAQ/001shellcheck.net
  • 尤其是"Field splitting, ..." section of BashFAQ #1。您可以让read 进行字段拆分并避免使用cut 的东西。
  • 顺便说一句,您现在所做的直接问题是每次使用cat $TESTFILE 时,它都会读取整个文件,而不仅仅是当前行。 echo "$i" | cut ... 将是直接修复,但真正使用 read 循环可以简化一切。
  • 如果可以进行简单的分配,请不要使用export

标签: bash shell ssh hive sh


【解决方案1】:

正如评论所指出的,当前的解决方案错误地多次重新处理 TESTFILE。更简单的替代方法是使用“读取”循环遍历行:

while IFS=, read date Name ; do
    echo beeline --outputformat=csv2 --hivevar Name="$Name" --hivevar date="$date"  -u "${beeURL}" -f TEST.hql
done < $TESTFILE

它只是遍历 TESTFILE 中的行,然后执行 beeline 命令。建议使用引号来防止输入文件中的错误 - 特别是空格,它会“破坏”命令行。

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2021-06-21
    • 2019-11-29
    • 2012-10-18
    • 2020-01-21
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多