【问题标题】:Redirection based on variables assigned within while loop setup基于 while 循环设置中分配的变量的重定向
【发布时间】:2015-09-05 16:59:06
【问题描述】:

我想在循环外访问while循环变量

while read line
do
...
...
...
done < $file > /home/Logs/Sample_$line_$(date +"%Y%m%d_%H%M%S").log

在上面的示例中,无论生成的日志文件没有 line 变量的值。即 $line 在这里不起作用。

请让我知道如何编写它以使其工作。

#!/bin/sh
exec 1> /home/Logs/`basename $0 | cut -d"." -f1 | sed 's/\.sh//g'`_$(date +"%Y%m%d_%H%M%S").log 2>&1
echo "Execution Started : `date` \n"
SQL_DIR=/home/Sql
INFILE=in_file
TEMPFILE=temp_file
RETURN_CODE=0
ls -ltr $SQL_DIR|grep ".sql"|awk -F" " '{print $9}'|awk -F"." '{print $1}' > $INFILE
sed '/^$/d' $INFILE > $TEMPFILE; mv $TEMPFILE $INFILE

while read line
do
      {
        START_TIME=`date +%s`

        printf "\n SQL File Executed Is : $line.sql"
        SQL_FILE_NM=$line.sql
        SQL_FILE=$SQL_DIR/$SQL_FILE_NM
        nzsql -db netezza_db -Atqf $SQL_FILE > /dev/null

        RETURN_CODE=$?
        if [ $RETURN_CODE -eq 0 ]; then
                echo "Time taken to execute sqlfile $SQL_FILE=$TT_HRS:$TT_MINS:$TT_REM_SECS HH:MM:SS" > $TEMPFILE
                printf "\n Success: Sql completed successfully at `date` \n"
                cat $TEMPFILE|mailx -s "Time taken to execute sqlfile $SQL_FILE=$TT_HRS:$TT_MINS:$TT_REM_SECS HH:MM:SS" 'koushik.chandra@a.com'
        else
                printf "\n Error: Failed in sql execution at `date`"
                exit $RETURN_CODE
        fi

        END_TIME=`date +%s`
        TT_SECS=$(( END_TIME - START_TIME))
        TT_HRS=$(( TT_SECS / 3600 ))
        TT_REM_MS=$(( TT_SECS % 3600 ))
        TT_MINS=$(( TT_REM_MS / 60 ))
        TT_REM_SECS=$(( TT_REM_MS % 60 ))
        printf "\n"
        printf "Total time taken to execute the sql $line="$TT_HRS:$TT_MINS:$TT_REM_SECS HH:MM:SS
        printf "\n"
      } > /home/Logs/sql_query_time_$line_$(date +"%Y%m%d_%H%M%S").log

done < $INFILE

rm -f $INFILE $TEMPFILE
exit $RETURN_CODE

【问题讨论】:

  • 这很奇怪。line 变量将随着输入文件的每一行而改变。
  • 是的......如果我在文件中有 3 行。然后我想生成 3 个日志文件,日志文件名应该包含处理文件的详细信息。
  • 根据我的理解,虽然在子shell中执行,但如果我们可以在当前shell中执行它,那么可能可以实现。我们如何在当前 shell 中执行?
  • 哦 .. 将行变量放在大括号内后它可以工作,如下所示:/home/Logs/sql_query_time_$**{**line**}**_$(date +"%Y%m%d_%H%M%S").log
  • 仅供参考,这是“代码示例”,而不是“代码 sn-p”功能的用途。 “代码 sn-ps” 用于可以在浏览器中运行的东西。

标签: shell while-loop do-while


【解决方案1】:

您实际上需要在 while 循环内进行重定向:

while read -r line; do
   { cmd1; cmd2; cmd3; } > "/home/Logs/Sample_${line}_$(date +"%Y%m%d_%H%M%S").log"
done < "$file"

当您在done 之后有&gt; outfile 时,输出将仅重定向到一个文件。

【讨论】:

  • 我在 while 循环中执行了几个命令,我不想在每个命令之后添加这个重定向
  • 没有。使用这种方法仍然不会获取 line 变量的值。
  • 这不是真的。 line 的值可用。显示有问题的脚本。
  • @KoushikChandra,没有大括号,_ 被视为变量名的一部分。
  • 感谢 anubhava 和 Charles Duffy
猜你喜欢
  • 2013-04-07
  • 2015-11-04
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多