Shell脚本中的命令行参数?

4

我正在尝试包含这个

du -s *|awk '{ if ($1 > 3000) print }'

在一个shell脚本中,我想将“3000”参数化。然而,由于已经在使用$1,我不确定该怎么做。以下尝试失败了:
size=$1
du -s *|awk '{ if ($1 > $size) print }'

我该如何在上面的第一个脚本中传递一个参数来代替3000?

{if ($1 > $size) print} 相当于 $1>size - ghostdog74
@ghostdog74,嗯,这个size=$1; du -s *|awk '{ $1>size }'不起作用...不确定你的评论是什么意思。 - Dan Rosenstark
在 awk 中,{if ($1 > $size) print}$1>size 是一样的意思。请查看我的答案以获取更清晰的图片。 - ghostdog74
4个回答

4

在将shell变量传递给awk时,尽可能使用awk的-v选项。这比四面八方都加引号更加“干净”。

size="$1"
du -s *| awk -v size="$size" '$1>size'

size="$1" 中的引号是不必要的。简单的变量赋值(FOO=$BAR)不需要引号。 - Idelic
这是我的习惯,有时候放进去也没有坏处。 - ghostdog74

3

单引号会抑制扩展,因此:

du -s *|awk '{ if ($1 > '"$1"') print }'

这是一个很好的答案。您能否解释一下它为什么比“du -s *|awk '{ if ($1 > '$1') print }'”更好/更差/相同? - Dan Rosenstark
如果第一个参数包含空格(它不应该,但我宁愿不抱希望事情能够顺利进行),那么省略双引号将导致awk不能按预期工作。 - Ignacio Vazquez-Abrams

3
size=$1
du -s *|awk '{ if ($1 > '$size') print }'

要小心一点,因为传递一个带有空格的参数会导致失败。当然,这可能是可取的。 - a'r
但是使用您的答案,您也可以取消$size并在使用$size的地方使用$1。这个选项有什么问题吗? - Dan Rosenstark

1

你可以在 awk 命令行上设置变量:

du -s * | awk '{ if ($1 > threshold) print }' threshold=$1

使用这种方法的唯一例外是,在BEGIN{}块中threshold将没有值。 - ghostdog74
@ghostdog74,如果没有BEGIN{}块,你会错过什么? - Dan Rosenstark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接