2013-07-01 119 views
3

我不理解这是如何不起作用:击:变量文件路径

ls /sys/class/net/wlan0 
addr_assign_type broadcast device flags iflink  netdev_group queues 
subsystem uevent addr_len carrier dormant ifalias link_mode **operstate** 
speed tx_queue_len address dev_id duplex ifindex mtu power statistics 


for f in $(ls /sys/class/net/); do $(cat /sys/class/net/${f}/operstate); done 
cat: /sys/class/net/eth0/operstate: No such file or directory 
cat: /sys/class/net/lo/operstate: No such file or directory 
cat: /sys/class/net/wlan0/operstate: No such file or directory 

我猜$ F没有及时扩大了cat。我尝试了引号,例如“$ f”,但仍然无效。

这样确实OK:

for f in $(ls /sys/class/net/); do echo /sys/class/net/${f}/operstate; done 
/sys/class/net/eth0/operstate 
/sys/class/net/lo/operstate 
/sys/class/net/wlan0/operstate 

和:

cat /sys/class/net/eth0/operstate 
up 

有什么我错过了?为什么cat看不到循环中的文件?

+0

'echo'不关心它的参数是否存在于文件系统中。 –

+0

在/ sys/class/net/wlan0/operstate上执行ls -l – Owen

+0

到其他设备(硬件名称)的文件链接,但是'cat'确实有效? – Edouard

回答

2

首先,您不应该在循环内部重复/sys/class/net/,因为$f已经包含这些目录。

for f in $(ls /sys/class/net/); do $(cat ${f}/operstate); done 

接下来,$(...)里面的循环需要去。没有必要捕捉猫的输出。

for f in $(ls /sys/class/net/); do cat ${f}/operstate; done 

现在$(ls ...)可以免掉一个简单的通配符:

for f in /sys/class/net/*; do cat ${f}/operstate; done 

最后,整个循环可以与猫单个呼叫代替。

cat /sys/class/net/*/operstate 
+0

谢谢。为什么'猫'失败?因为错误的道路? – Edouard

+0

@爱德华我真的不知道。这是你的shell的确切输出吗?那些看起来不正确的错误信息。我会期望'cat:/ sys/class/net // sys/class/net/eth0/operstate:没有这样的文件或目录' –

+0

我只是将它们粘贴进来。 – Edouard

0

您的bash脚本正试图在/sys/class/net的每个子目录中调用cat文件operstate,并且未找到该文件。在第二个示例中,您只需输入一个字符串,该字符串可以很好地打印出来。