分享一条shell命令:是否有更简洁的处理方法

 一条命令写下来,感觉很酷~~

IFS_OLD=$IFS ;IFS=$'\n';for conn in $(nmcli c show |grep Wired|cut -b 1-19);do nmcli c show "$(echo $conn |awk '{gsub(/^\s+|\s+$/, "");print}')"|grep 'ipv4.method';done;IFS=$IFS_OLD

还是换行好看一些:
 

IFS_OLD=$IFS
IFS=$'\n'
for conn in $(nmcli c show |grep Wired|cut -b 1-19)
do 
nmcli c show "$(echo $conn |awk '{gsub(/^\s+|\s+$/, "");print}')"|grep 'ipv4.method'
done
IFS=$IFS_OLD

这一条shell命令填了若干坑:

1、for循环取值将完整参数打散了;

2、切割出来的参数末尾存在空格,需要去掉;

 

nmcli c show |grep Wired

Wired connection 1   1ad36a4f-96d7-3238-9fd1-b4a325498f46  ethernet  enp3s17   
Wired connection 10  c4885450-ed11-39d0-a008-b40528f3ad4a  ethernet  enp3s17f1 
Wired connection 11  55678260-795f-3ede-91a6-ef96a7534cdc  ethernet  enp3s16f4 

 

为了获得如下字段,我用了|cut -b 1-19 也可以使用|awk '{print $1" "$2" "$3}';

Wired connection 11
Wired connection 12
Wired connection 2

将上面获得的字段传给nmcli c show,查询该link设备的ipv4.method属性。但是IFS默认是空格,这会导致在for in中获得的参数是:

Wired
connection
1
Wired
connection
10
Wired

……

释义:IFS变量:Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符。

所以需要将默认IFS值备份,然后再讲IFS的值设置为换行符,最后将默认值重置回来。

如果前面用的是|cut -b 1-19,那么会导致如"Wired connection 2 "末尾会有空格,而多数linux命令并不会自动忽略字符前后空格。那么就需要去掉空格:

echo $conn |awk '{gsub(/^\s+|\s+$/, "");print}'

因为$conn的值存在空格,需要使用引号引起来:

"$(echo $conn |awk '{gsub(/^\s+|\s+$/, "");print}')"

最后运行的效果如下:

……

ipv4.method:                            auto
ipv4.method:                            auto
……

如有更好的处理方法,请留言给我多谢! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值