【问题标题】:bash $1 inside command from functionbash $1 inside 命令来自函数
【发布时间】:2016-05-24 07:40:36
【问题描述】:

有人可以建议如何解决这种情况:

我用 arg 调用函数:

funct $size

然后我需要在函数内部运行 bash 命令

function funct {
    arg=$1
    files=(`find /var/ -mindepth 3 -maxdepth 3 -type d -exec du -bs {} \; |  awk '$1>$arg'`)
}

问题在于awk '$1>$arg' 我总是从find-du 结果中得到awk '$size>$size',而不是$1

有人可以帮忙吗? 提前谢谢你。

【问题讨论】:

  • 您是否对不那么损坏的答案感兴趣(即,与带有空格、glob 等的目录名称一起正常工作)?
  • ...要清楚,array=( $(...) ) 或其较不现代的等价物array=( `...` ) 几乎总是会有错误:未引用的扩展(这是将项目拆分为单个元素的方式)在 IFS 中对字符进行字符串拆分和 glob 扩展(这意味着如果您在输出中的任何位置都有一个空格包围的 *,它将被当前目录的内容替换)。填充数组的正确方法是使用 read -amapfilereadarraywhile read 循环。
  • ...另外,考虑避免使用function 关键字。它与基线 POSIX shell 不兼容(声明函数的适当语法是 funct() { - 前面没有 function 关键字,并且附加的 () 是强制性的),但是 - 与更有用的 bashisms 不同 - 给出您对兼容/标准化的语法没有任何好处。

标签: bash function arguments


【解决方案1】:

shell 不会扩展 $arg,因为它是单引号。对于 find-awk 管道,请尝试:

find /var/ -mindepth 3 -maxdepth 3 -type d -exec du -bs {} \; |  awk -v arg="$arg" '$1>arg'

这里,-v arg="$arg" 创建了一个名为 arg 的 awk 变量,并将 shell 变量 arg 的值赋给它。

请注意,如果任何目录名称中包含空格,则数组 files 可能不是您所期望的。

【讨论】:

    【解决方案2】:

    func get $size as $1... 如果你想使用 $1(因为你在 func 之外),只需将它作为附加参数传递给 func,比如说 arg2?

    然后比较$arg2> $size。

    它会解决你的问题:) * 发生这种情况是因为 $1 是每个上下文的局部变量。 func 和调用 func 的地方是不同的上下文,所以 $1 有不同的含义。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2011-05-06
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多