一条命令写下来,感觉很酷~~
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
……
如有更好的处理方法,请留言给我多谢!