Bash:文件路径中的变量

时间:2013-07-01 02:02:15

标签: 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  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  /sys/class/net/eth0/operstate 
up

我错过了什么?为什么cat无法查看循环中的文件?

2 个答案:

答案 0 :(得分: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的单个调用替换。

cat /sys/class/net/*/operstate

答案 1 :(得分:0)

您的bash脚本正在cat的每个子目录中尝试operstate名为/sys/class/net的文件,但找不到该文件。在第二个例子中,你简单地echo打印出一个很好的字符串。