bash脚本中计数器变量的值为零

时间:2017-02-22 17:31:57

标签: bash variables counter addition

SELECT TOP 1
Loc.[PLACE-REF],
Tenant.[TENANCY-REF],
PChar.[ACCOUNT-CODE],
PChar.[START-DATE],
PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT]
FROM
dbo.[RE-TENANCY] AS TenanT
LEFT JOIN dbo.[RE-TNCY-PLACE] AS TncyPlace 
    ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF]
LEFT JOIN dbo.[IH-LOCATION] AS Loc 
    ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF]
LEFT JOIN dbo.[IH-PLACE-CHG] AS PChar 
    ON Pchar.[PLACE-REF] = Loc.[PLACE-REF]
WHERE
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017')
)
AND Tenant.[TNCY-STATUS] = 'CUR'        
AND PChar.[ACCOUNT-CODE] = 'MEALS'  
AND Loc.[PLACE-REF] = '166CHA010'
ORDER BY PChar.[START-DATE] DESC
;

以下是上述内容的输出。我只给出了部分代码,让我有理由退休!

filecount=0
if [ -e "$filename$ext" ]
  then
   ls -l $filename$ext
   scp $filename$ext t2flex@ccfilesvr:/home/t2flex/.
   mv  $filename$ext $filename"_"$d$done
   echo $filename$ext secure copied to ccfilesvr
   filecount=$((filecount+1))
else
   echo "$filename$ext Not found in $path."
fi | tee >> $logfile
# -----------------------------------------------------
if [ -e "$filenam1$ext" ]
    then
     ls -l $filenam1$ext
     scp $filenam1$ext t2flex@ccfilesvr:/home/t2flex/.
     mv -f $filenam1$ext $filenam1"_"$d$done
     echo "$filenam1$ext secure copied to ccfilesvr"
     filecount=$((filecount+1))
else
     echo "$filenam1$ext Not found in $path."
fi 
# ----------------------------------
echo "Number of files to transfer into ccfilesvr: $filecount" >> $logfile
if [ $filecount -ge 1 ]
  then
   echo "Files ready to upload to T2. Entering ccfilesvr..."
   ssh t2flex@ccfilesvr . t2flexXfer.shl
else
  echo "No files to upload. Entering ccfilesvr to download charges."
   ssh t2flex@ccfilesvr . t2flexXfer.shl
fi
echo "Number of files to transfer into ccfilesvr: $filecount">> $logfile

为什么计数器总是以" 0"对我来说?

1 个答案:

答案 0 :(得分:1)

来自chepner的评论是正确的诊断。

替换它:

fi | tee >> $logfile

有了这个:

fi > >(tee >> $logfile)

有什么区别?

使用|汇总语句时,"左"管道的一部分在子shell中执行,子shell不能(无法)修改父shell中的变量。子shell结束时,指定的值将丢失,将控制权返回给父shell(生活在计算机的单独内存部分中)。容易遗漏的原因是子shell继承了来自父shell的所有变量的相同副本,因此您没有清楚地看到正在启动子shell。

一种看待它的方法是输出" $ BASHPID",它反映了当前的子shell数量(与#34; $$和#34相反;它反映了主要的shell)。

通过使用进程替换(> >(tee >> $logfile)),if语句在主shell中执行,tee在子shell中,因此对您来说很重要的部分(具有作业的那个是留在主壳中的。

与标准管道相比,我不知道处理替换的许多缺点。它们可以嵌套(可能比管道更不易读取)以实现多个阶段。它们存在于&#34;输出&#34;品种(>())和&#34;输入&#34;品种(<())。进程替换导致FIFO(特殊文件)的创建,并且shell将表达式转换为可以读取或写入的文件名(取决于类型),因此它们基本上可以在接受文件名的任何地方使用。