在bash脚本中同步变量名

时间:2018-04-17 20:29:18

标签: bash

我正在尝试根据上一个命令的输出运行命令:

ifaces=$(ls /sys/class/net)
for i in "${ifaces[@]}"
do
   mac=$(cat /sys/class/net/$i/address)
   echo "$i: $mac"
done

但它没有用,我不确定我的连接方法是否错误?

2 个答案:

答案 0 :(得分:2)

for i in /sys/class/net/*; do
  mac=$(<"$i/address")
  echo "${i##*/}: $mac"
done
  • ls输出格式化为人类可读性而非编程使用。因为文件名可以包含文字换行符,但是ls将名称​​与换行符分开,所以不可能字面上代表这些名称(没有转义字符或序列)并区分名称末尾和下一个开头的位置。 Don't use it programatically.
  • $(<file)$(cat "$file")不同,实际上不需要fork()关闭子进程,或exec()外部可执行文件。因此,它的效率要高得多。
  • ${i##*/}删除与glob表达式*/匹配的最长字符串到变量$i。因此,它实际上只返回文件名。

答案 1 :(得分:0)

当你将ls的输出分配给ifaces时,用数组包装它以成功迭代内容:

ifaces=($(ls /sys/class/net))
for i in "${ifaces[@]}"
do
   mac=$(cat /sys/class/net/$i/address)
   echo "$i: $mac"
done