【问题标题】:Bash. Shell variables logic [duplicate]重击。 Shell 变量逻辑
【发布时间】:2014-05-12 02:08:43
【问题描述】:

我有以下脚本:

ls -l | while read permissions number user user2 size month day hour filename
  do
    if [[ "$filename" == *foo* ]]
    then
      scount=`expr $scount + $size`
    fi
  done
echo $scount

脚本检查我文件夹中文件的文件名和大小,然后检查包含“foo”字样的文件,然后获取大小并添加它。

我有以下问题,如果我从循环内部调用 scount 变量,它会显示数字,但是当它在外部时,它什么也不显示,就好像该变量不存在一样。它与shell会话有关吗?如何在循环外显示变量?

【问题讨论】:

  • 只是一个猜测,但也许你必须在循环外声明你的变量:-)
  • 您正在子shell 中操作变量。请参阅链接的问题以获得答案。
  • 作为旁注:为了解析有关文件的信息,请使用stat 而不是ls。如果您想计算给定数量的文件的大小,请查看du
  • @devnull 是正确的 - 子外壳是问题所在。循环查找结果可能更适合您的目的:for f in $(find /my/dir -name "*foo*"); do ... done 并使用stat 获取每个$f 的大小。
  • 谢谢乔希。我一定会检查 devnull 引用并使用 find 和 stat 重写我的代码。

标签: linux bash shell


【解决方案1】:

您的while 循环在子shell 中运行,因此它的变量在外部不可见。试试这个:

#!/bin/bash

while read current; do
   echo "current: $current"
   last=$current
done < <(echo -e "foo\nbar\nbaz")

echo "last: $last"

【讨论】:

  • 谢谢。我已经使用 Josh Jolly 和 devnull 的建议重写了代码,现在它可以正常运行了。谢谢大家。
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多