bash脚本正确解释awk

时间:2016-02-16 15:55:55

标签: linux bash shell awk

我有一个for循环脚本需要登录主机并获取其主机名和eth0接口的值。我使用下面的代码,但是在bash脚本上运行它时,没有正确读取awk命令

    #!/bin/bash

for i in `cat test.txt`;

do

store_number=$(ssh -q -A -o userknownhostsfile=/dev/null -o stricthostkeychecking=no -o batchmode=yes -o connecttimeout=5 "$i" "hostname | cut -c4-7");

eth0_ip=$(ssh -q -A -o userknownhostsfile=/dev/null -o stricthostkeychecking=no -o batchmode=yes -o connecttimeout=5 "$i" "sudo ifconfig eth0 | awk 'FNR==2 {print $2}'");

output="${store_number}: ${eth0_ip}"; echo $output >> /home/eth0status.txt;

done

输出如下:

0021: inet addr:10.1.10.62 Bcast:10.1.10.255 Mask:255.255.255.0

0022: inet addr:10.0.1.74 Bcast:10.0.1.255 Mask:255.255.255.0

0023: inet addr:172.16.16.103 Bcast:172.16.16.255 Mask:255.255.255.0

我需要输出类似于:

0021: addr:10.1.10.62 

0022: addr:10.0.1.74

0023: addr:172.16.16.103

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

引用是一个难题。当你写:

eth0_ip=$(ssh ... "$i" "sudo ifconfig eth0 | awk 'FNR==2 {print $2}'");

内部单引号''无法阻止$2的扩展。 shell在双引号中看到$2。它将执行变量扩展,并且很可能是您的第二个参数(脚本的$2)未设置。测试一下:

$ echo "sudo ifconfig eth0 | awk 'FNR==2 {print $2}'"
sudo ifconfig eth0 | awk 'FNR==2 {print }'

要么转义$,要么在外面使用单引号,或者像其他人推荐的那样,请在SSH命令之外使用awk