Bash:文件路径中的变量

Bash:文件路径中的变量,bash,variables,Bash,Variables,我不明白这是怎么回事: 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

我不明白这是怎么回事:

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”,但还是没用

这确实可行:

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
看不到循环中的文件?

您的bash脚本试图在
/sys/class/net
的每个子目录中找到名为
operate
cat
文件,但找不到该文件。在第二个示例中,您只需使用
echo
ing字符串即可打印出来

首先,您不应该在循环中重复
/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的调用来代替

cat /sys/class/net/*/operstate

echo
不关心它的参数是否存在于文件系统中。是否在/sys/class/net/wlan0/operstate文件链接到其他设备(硬件名称)上执行ls-l操作,但是
cat
是否工作?@Edouard我真的不知道。这就是你的shell的输出吗?这些看起来不像是正确的错误消息。我本以为
cat:/sys/class/net//sys/class/net/eth0/operstate:没有这样的文件或目录
cat /sys/class/net/*/operstate