我正在尝试根据上一个命令的输出运行命令:
ifaces=$(ls /sys/class/net)
for i in "${ifaces[@]}"
do
mac=$(cat /sys/class/net/$i/address)
echo "$i: $mac"
done
但它没有用,我不确定我的连接方法是否错误?
答案 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