为什么不行?
x=5
$ ls -l | awk '{print $(($x))}'
应该打印ls -l命令的字段5,对吗?
应该将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="%sn" *
假设ls
的第五列与我的相同,这将显示当前目录中的所有文件大小。
您可以访问类似于这些的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"]}'
这是一个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}"
试试这个:
ls -l | awk '{print $'$x'}'