免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3983 | 回复: 10
打印 上一主题 下一主题

[系统管理] 【已解决】read重定向,从命令获取变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-20 02:04 |只看该作者 |倒序浏览
本帖最后由 jneny 于 2017-06-21 12:56 编辑

各位好:
请问关于read 命令从 命令的重定向读取值的问题, read NETIP BCAST MASK < <( ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}')  
这句命令在SHELL中能正常赋值3个变量,但是加到脚本中则会提示  会报错: syntax error near unexpected token `<'
我使用了bash  -x  test.sh 也没有找到原因,请帮忙解答,谢谢!

论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
2 [报告]
发表于 2017-06-20 09:56 |只看该作者
脚本中用#!/bin/bash,而不要用#!/bin/sh

论坛徽章:
0
3 [报告]
发表于 2017-06-20 15:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
4 [报告]
发表于 2017-06-20 16:27 |只看该作者
[root@cn2 ~]# cat ttt.sh
#!/bin/bash

read NETIP BCAST MASK < <( ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}')

echo "NETIP=$NETIP"
echo "BCAST=$BCAST"
echo "MASK=$MASK"

[root@CN2 ~]# sh ttt.sh
ttt.sh: line 3: syntax error near unexpected token `<'
ttt.sh: line 3: `read NETIP BCAST MASK < <( ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}') '
[root@CN2 ~]# bash ttt.sh
NETIP=192.168.61.32
BCAST=192.168.61.255
MASK=255.255.255.0
[root@CN2 ~]#
[root@CN2 ~]# bash --posix ttt.sh
ttt.sh: line 3: syntax error near unexpected token `<'
ttt.sh: line 3: `read NETIP BCAST MASK < <( ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}') '

< <( ... ) 是 bash 的特性, 不兼容 posix, 建议不要这么写

论坛徽章:
0
5 [报告]
发表于 2017-06-20 18:16 |只看该作者
WilliBhamlll 发表于 2017-06-20 09:56
脚本中用#!/bin/bash,而不要用#!/bin/sh

脚本中是#/bin/bash  sh 也指向bash的

论坛徽章:
0
6 [报告]
发表于 2017-06-20 18:24 |只看该作者
reyleon 发表于 2017-06-20 16:27
[root@cn2 ~]# cat ttt.sh
#!/bin/bash

有兼容posix的写法吗?sh和bash都能用的?

其实< <()这种写法是什么意思?

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
7 [报告]
发表于 2017-06-21 10:35 |只看该作者
回复 6# jneny


比如你可以写成这样:

ipinfos=($(ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}'| head -1 ))
NETIP=${ipinfos[0]}
BCAST=${ipinfos[1]}
MASK=${ipinfos[2]}


< <( ... )

前面一个 < 表示重定向
<(...) 表示进程替换, 会以 /dev/fd/xxoo 的方式打开文件

read NETIP BCAST MASK < <( ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}')  
实际上是
read NETIP BCAST MASK < /dev/fd/xxoo

论坛徽章:
0
8 [报告]
发表于 2017-06-21 12:54 |只看该作者
reyleon 发表于 2017-06-21 10:35
回复 6# jneny

感谢详细的解答!代码收下了。

论坛徽章:
0
9 [报告]
发表于 2017-06-21 13:53 |只看该作者

[root@test tmp]# ipinfos=($(ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}'| head -1 ))
[root@test tmp]# echo $ipinfos
192.168.0.90
[root@test tmp]# NETIP=${ipinfos[0]}; echo $NETIP
192.168.0.90
[root@test tmp]# BCAST=${ipinfos[1]}; echo $BCAST
192.168.0.127
[root@test tmp]# MASK=${ipinfos[2]}; echo $MASK
255.255.255.192


这代码好神奇呀,有如下疑问:
1、ipinfos 这段用($((xxx ))   为什么命令外面要用() 引起来呀?
2、为什么ipinfos只有一行变量为什么,后面的NETIP、BCAST、MASK  能获取到变量呀?
3、变量中 []  是干嘛用呀?

论坛徽章:
0
10 [报告]
发表于 2017-06-21 13:55 |只看该作者

[root@test tmp]# ipinfos=($(ifconfig  eth0|grep addr:  |awk -F'[ :]+' '{print $4,$6,$8}'| head -1 ))
[root@test tmp]# echo $ipinfos
192.168.0.90
[root@test tmp]# NETIP=${ipinfos[0]}; echo $NETIP
192.168.0.90
[root@test tmp]# BCAST=${ipinfos[1]}; echo $BCAST
192.168.0.127
[root@test tmp]# MASK=${ipinfos[2]}; echo $MASK
255.255.255.192


这代码好神奇呀,有如下疑问:
1、ipinfos 这段用($((xxx ))   为什么命令外面要用() 引起来呀?
2、为什么ipinfos只有一行变量为什么,后面的NETIP、BCAST、MASK  能获取到变量呀?
3、变量中 []是什么作用呀,(我开始以为是截取第1段,第2段这样)?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP