AWK 如何继承 SHELL 脚本中的字典
shell a.sh 脚本读取了一个外部配置文件, 脚本内容如下:
#!/bin/bash
source /home/ec2-user/scripts/etc/test.d
echo ""| awk -v dict="$dict" '{for (i in dict) print i","dict[i]}'
配置文件内容如下:
$ cat etc/test.d
declare -A dict
dict=([1]="a" [2]="b")
执行后报错:
bash a.sh
awk: {for (i in dict) {print i","dict[i]}}
awk: ^ ?????????
所以想请教下如何才能将 shell 配置里的 关联数组 传到 awk 里面使用呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
做不到, 我查阅了
awk
和bash
的官方文档的大部分内容, 没有找到相关语法.但从另一方面说, 你可能没意识到
awk
和bash
是两种编程语言, 而在任意两种语言中, 复杂的数据结构都是不可能共享的. 你做不到将ruby
的数组变量共享到python
的程序, 除非某些人写一个中间沟通程序.如何实现变量(对象)共享:
同种语言间的变量(或者对象)共享, 往往将对象序列化后存储到磁盘, 下次再从磁盘读取重新对象化来实现, 这能实现类型不变.
不同语言间的变量共享, 往往通过输入和输出来共享(
IO
), 你可以自定义输入输出格式, 也可以使用共享的格式, 如JSON
.两种方式原理没有本质区别, 只是第一种在底层做了同样的工作.
以数组为例,
A
程序将数组一个个输出成字串, 并以:
分隔, 如a:b:c:d
, 再在B
程序读入, 调用split
分隔成数组. 以字典为例, 使用JSON
通用数据格式, 以{ 1: 'a', 2: 'b' }
输出, 再在另一个程序JSON.parse
构建对象.不同语言间的变量共享的通用做法还是
JSON
, 但awk
或bash
都不支持这个, 所以还是简单的IO
吧.但遗憾的是,
bash
没办法获取关联数组(也称字典或哈希或映射)的键, 而awk
也没有便捷的将字串转换成关联数组的内建函数.唯一可行的方式:
类似上述代码, 虽然跟没写一样.
${d[*]}
意思是取索引数组的所有元素, 默认以分隔, 你可以设置
IFS
环境变量, 如:
, 以:
分隔.split
将字串以分隔符分隔写入数组变量.上述代码, 每一条在
shell
中执行都没错, 但写到脚本里面就是运行不过去, 说找不到文件BEGIN...
. 我就日了狗了. 我把d="a b c"
就又能执行, 但写成d=${dict[*]}
就是执行不过去. 然后在交互式shell
里又查不出问题.fuck the bash
.可以的话, 尽量选择现代脚本语言, 如
python
,ruby
等, 在sh
历史的污垢里不知道隐藏了多少奇技淫巧, 恶心死我了, 最后的代码折腾了半小时, 主要的是我不是shell
新手.