全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1777|回复: 12

[已解决] 【解决了】请教一个shell写法的问题

[复制链接]
发表于 2023-9-25 00:26:28 | 显示全部楼层 |阅读模式
本帖最后由 yanzhiling2002 于 2023-9-25 01:15 编辑

centos 中获取 网卡列表 可以这么写


  1. output=$(ip -o link show | awk -F': ' '{print $2}')
  2. 或者
  3. output=$(ls /sys/class/net)
复制代码


现在echo $output的内容是:docker0  ens33  ens36  lo  vethb1efb23

我现在想把 $output 的内容分割成一个数组,分隔符是什么呢? 空格或者换行都不行



  1. IFS=' ' read -ra my_array <<< "$output"
  2. 或者
  3. IFS='\n ' read -ra my_array <<< "$output"

复制代码


这样分割完的my_array数组只有一个值,为什么呢

发表于 2023-9-25 00:28:50 | 显示全部楼层
这种问题自己组织一下问chatgpt即可
发表于 2023-9-25 00:29:00 来自手机 | 显示全部楼层
IFS=$'\n' read -ra my_array <<< "$output"
 楼主| 发表于 2023-9-25 00:29:47 | 显示全部楼层
feya 发表于 2023-9-25 00:28
这种问题自己组织一下问chatgpt即可

我翻来覆去得问过了,他给的答案 在实操中不管用
发表于 2023-9-25 00:35:00 来自手机 | 显示全部楼层
数组为什么不直接用,要去切割呢 mapfile -t my_array < <(ls /sys/class/net)
 楼主| 发表于 2023-9-25 00:44:54 | 显示全部楼层
本帖最后由 yanzhiling2002 于 2023-9-25 01:15 编辑
buste 发表于 2023-9-25 00:35
数组为什么不直接用,要去切割呢 mapfile -t my_array <


可以了,谢谢大佬
发表于 2023-9-25 00:53:55 | 显示全部楼层
  1. 非常抱歉,我的错误。在旧版本的Bash中,确实没有`-a`选项来定义数组。在这种情况下,您可以使用循环来将输出存储到数组中。以下是一个示例脚本:

  2. ```bash
  3. #!/bin/bash

  4. # 获取网卡列表并存储到数组中
  5. NIC_ARRAY=()
  6. while IFS= read -r line; do
  7.   NIC_ARRAY+=("$line")
  8. done < <(ip -o -4 addr show | awk '{print $2}')

  9. # 打印数组中的网卡列表
  10. for nic in "${NIC_ARRAY[@]}"; do
  11.   echo "$nic"
  12. done
  13. ```

  14. 这个脚本使用`while`循环读取`ip -o -4 addr show`的输出,并将每行存储到`NIC_ARRAY`数组中。然后,通过循环遍历数组来打印网卡列表。

  15. 请注意,这个示例脚本将打印出网卡列表。您可以根据自己的需求修改脚本以执行其他操作。对于较新的Bash版本,您可以使用`mapfile`命令来更简洁地实现相同的功能。

  16. #!/bin/bash

  17. mapfile -t NIC_ARRAY < <(ip -o -4 addr show | awk '{print $2}')

  18. # 打印数组中的网卡列表
  19. for nic in "${NIC_ARRAY[@]}"; do
  20.     echo "$nic"
  21. done
复制代码
 楼主| 发表于 2023-9-25 02:27:04 | 显示全部楼层
buste 发表于 2023-9-25 00:35
数组为什么不直接用,要去切割呢 mapfile -t my_array <

大佬我还有个问题想请教一下

mapfile 是按行读取文本并删除末尾的换行符

我理解的行是:
1
2
3
4
这种竖着的换行。

ls /sys/class/net 的输出是 1 2 3 4 ,这种横着的,这样横着,mapfile -t不就是删掉 4后面的换行嘛,读取123写进数组0里

怎么感觉像是按照第一种都是换行处理了
发表于 2023-9-25 10:24:35 | 显示全部楼层
yanzhiling2002 发表于 2023-9-25 02:27
大佬我还有个问题想请教一下

mapfile 是按行读取文本并删除末尾的换行符

你不要具体去看终端给你的展示是横还是纵, 本质上分割要么是' '要么是'\n'这种分割字符, mapfile就是按这些分割符来分配数组的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-3 18:12 , Processed in 0.062452 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表