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

bash脚本中计数器变量的值为零,bash,variables,counter,addition,Bash,Variables,Counter,Addition,以下是上述内容的输出。。我只给出了让我有理由退休的部分代码 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 fileco

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

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”?

切普纳的评论是正确的诊断

替换此项:

-rw-r--r-- 1 oracle dba 455132 Feb 21 14:14 CC_T2_PERSON.txt
CC_T2_PERSON.txt secure copied to ccfilesvr
-rw-r--r-- 1 oracle dba 107314 Feb 21 14:14 CC_T2_CAMPUSBOX.txt
CC_T2_CAMPUSBOX.txt secure copied to ccfilesvr
Number of files to transfer into ccfilesvr: **0**
No files to upload.
为此:

fi | tee >> $logfile
有什么区别

使用
|
管道化语句时,管道的“左”部分在子shell中执行,子shell无法(绝对)修改父shell中的变量。子shell结束时,分配的值将丢失,从而将控制权返回父shell(位于计算机的单独内存部分)。容易忽略的是,子shell从父shell继承了所有变量的相同副本,因此您无法清楚地看到正在启动子shell

查看它的一种方法是输出“$BASHPID”,它反映了当前的子shell PID编号(与反映主shell的“$$”相反)

通过使用进程替换(
>(tee>$logfile)
),在主shell中执行
if
语句,并且
tee
在子shell中,因此对您来说重要的部分(具有赋值的部分)就是留在主shell中的部分


与标准管道相比,我不知道工艺替代有很多缺点。它们可以嵌套(其可读性可能不如管道)以实现多个阶段。它们存在于“输出”类型(
()
)和“输入”类型(
我尝试将上面的“0”加粗,并显示星号。忽略**。也忽略| tee$logfile…为了可读性,我想删除它,但忘记了。
tee
命令(或者更确切地说是用于将其输入连接到
if
语句的输出的管道)这似乎是问题所在。您正在子进程中递增
filecount
。递增filecount后添加调试回音。好的,谢谢。递增filecount后我将添加调试回音。我不会对脚本进行管道测试…我将使用重定向>>。太好了!!!谢谢!文件计数是:1个文件计数是:2个文件数是:t传输到ccfilesvr:2个文件准备上载到T2。正在输入ccfilesvr。。。
fi > >(tee >> $logfile)