为什么这不起作用?
x=5
$ ls -l | awk '{print $(($x))}'
应该打印ls -l命令的字段5,对吗?
答案 0 :(得分:3)
应将shell变量的值传递给awk
的唯一方法如下
$ x=5
$ ls -l | awk -v x="$x" '{print $x}'
$ ls -l | awk '{print $x}' x="$x"
这两种方法的主要区别在于,通过使用-v
,x
块中设置BEGIN
的值,而第二种方法则不设置值。所有其他引用技巧或逃避的方法都不应该,除非你喜欢头痛。
但是你不想要解析ls
,你真正想要的命令是:
stat --printf="%s\n" *
假设ls
的第五列与我的相同,这将显示当前目录中的所有文件大小。
答案 1 :(得分:2)
您可以访问类似于这些的shell变量;
第一种方式不建议!
x=5
ls -l | awk '{print $'$x'}'
或者在执行程序开始之前将值x赋给变量shellVar
x=5
ls -l | awk -v shellVar="$x" '{print $shellVar}'
或使用包含当前环境值的数组
export x=5
ls -l | awk '{print $ENVIRON["x"]}'
答案 2 :(得分:1)
这是一个shell变量,它不会被shell用单引号扩展。我们将awk脚本放在单引号中的原因恰恰是为了防止shell解释为awk的好处而搞砸的东西,但有时候你希望shell解释它的一部分。
对于这样的事情,我更喜欢将值作为awk变量传递:
ls -l | awk -v "x=$x" '{print $x}'
但你可以做其他许多方式。例如,这个:
ls -l | awk '{print $'$x'}'
应该是这样的:
ls -l | awk '{print $'"$x"'}'
或者,这个:
ls -l | awk "{print \$$x}"
答案 3 :(得分:0)
试试这个:
ls -l | awk '{print $'$x'}'