【问题标题】:value of counter variable is zero in bash scriptbash脚本中计数器变量的值为零
【发布时间】:2017-02-22 17:31:57
【问题描述】:
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

下面是上面的输出。我只给出让我有理由退休的代码部分!

-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.

为什么我的计数器总是显示为“0”?

【问题讨论】:

  • 我尝试将上面的“0”加粗,星号出来了。无视**。也无视| tee $logfile ...为了便于阅读,我想删除它,但忘记了。
  • tee 命令(或者更确切地说是用于将其输入连接到if 语句的输出的管道)似乎是问题所在。您正在子流程中增加 filecount
  • 增加文件计数后添加调试回显。
  • 好的,谢谢。在增加文件计数后,我将添加一个调试回显。我不会通过管道发送脚本...我将使用重定向 >>.
  • 完美!!!谢谢!文件数是:1 文件数是:2 要传输到 ccfilesvr 的文件数:2 准备上传到 T2 的文件。进入 ccfilesvr...

标签: bash variables counter addition


【解决方案1】:

chepner 的评论是正确的诊断。

替换这个:

fi | tee >> $logfile

有了这个:

fi > >(tee >> $logfile)

有什么区别?

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

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

通过使用进程替换 (> >(tee >> $logfile)),if 语句在主 shell 中执行,tee 在子 shell 中,所以对你很重要的部分(有分配的部分)是什么留在主外壳中。

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

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多