学艺不精,又被shell的管道给坑了
我用过bash shell,而且时间不短了。但我从来没学过shell,至少没有像C++这么认真去学。平时写些基本的脚本没问题,不懂也可以google、百度。可在2014最后一天,掉坑里了。
其实脚本也很简单,代码基本如下:
#!/bin/bash declare -A FILES #关联数组 bash version >= 4.0 cat EX_FILES | while read line
do
key=`echo $line | awk '{print $1}'`
value=`echo $line | awk '{print $2}'`
FILES[$key]=$value
done echo ${FILES[@]}
其实也就是从文件每次读出一行,再从一行中按列分解出key、value,然后再赋值到map里去。可以,输出的map居然为空。于是,开始了几个钟头的折腾。
一开始以为是关联数组的原因,因为是第一次用关联数组。可是google、百度,man bash,都是这么用的。在FILES[$key]=$value这里打印也是正确的,到while之外FILES却是空的。然后怀疑是因为key是字符串的原因,于是另起一个脚本测试,key为字符串完全没问题。想想这种情况应该是FILES成了局部变量(按C++的方式,这么想的),可我声明FILES时没用local啊。难道是while read的原因?于是搜索了一下"while read 局部变量",搜索到了大量的sub shell相关的问题,也正是我的问题。
在 cat EX_FILES | while ...done 这代码中,cat EX_FILES是在当前shell中运行,while ...done是在子shell中运行,所以当前shell的数组没有被赋值。解决的方法改一下就好:
#!/bin/bash declare -A FILES
while read line
do
key=`echo $line | awk '{print $1}'`
value=`echo $line | awk '{print $2}'`
FILES[$key]=$value
done < EX_FILES echo ${FILES[@]}
这样要注意EX_FILES可能因为换行符的原因读取不了最后一行
学艺不精,又被shell的管道给坑了的更多相关文章
- shell 中用管道模拟多线程
shell 中用管道模拟多线程 这里以两个例子来对比多线程和单进程 单线程的例子 # config.txt在这个例子和多线程的例子中都会用到 [root@ns_10.2.1.242 test]$ ca ...
- Linux Shell中管道的原理及C实现框架
在shell中我们经常用到管道,有没考虑过Shell是怎么实现管道的呢? cat minicom.log | grep "error" 标准输入.标准输出与管道 我们知道,每一个进 ...
- shell 命名管道,进程间通信
命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...
- SHELL脚本--管道和重定向基础
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.8.1 匿名管道"|" 管道符号意如其 ...
- shell 命名管道,进程间通信, ncat作http server
命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...
- shell 匿名管道和命名管道
管道的特点:如果管道中没有数据,那么取管道数据的操作就会滞留,直到管道内进入数据,然后读出后才会终止这一操作:同理,写入管道的操作如果没有读取管道的操作,这一动作也会滞留. 1,匿名管道 匿名管道使用 ...
- 鸟哥的私房菜:Bash shell(六)-管道命令
就如同前面所说的, bash 命令执行的时候有输出的数据会出现! 那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定? 这就牵涉到管线命令的问题了 (pipe) ,管线命令 ...
- shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
在exec执行一个子进程,我们希望使用管道取得子进程在重定向后的标准输出上的结果,同时等待子进程的结束.那么是等待子进程结束后才取管道数据,还是边取数据边等待子进程结束呢? 这里有一个调试的例子.u0 ...
- shell 过滤器(管道)
将几个命令通过管道符组合在一起就是一个管道,通常,通过这种方式使用的命令就被称为过滤器. 过滤器会获得输入,通过某种方式修改其内容,然后将其输出. 常用的被用作过滤器使用的命令为: 1.awk---用 ...
随机推荐
- 工作中用到的linux命令
都是工作中用到的,解决问题至上,不求甚解,怕再忘了,所以记录一下,勿喷. .log |,,,,|,| 先说一下这条命令: cat:打印文件内容 grep:查找,用到的有\s匹配空白字符 sed:刚用到 ...
- Android BLE开发之Android手机与BLE终端通信
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 近期穿戴设备发展得非常火.把相关技术也带旺了,当中一项是BLE(Bluetooth Low Energy).B ...
- 使用Qt Style Sheets制作UI特效
引言 作为一套GUI框架,Qt是非常强大的.(注:Qt 不仅是一套优秀的GUI框架,同时也是一套出色的应用程序框架).在UI的制作方面Qt为广大开发者提供了一套强大而易用的工具,她就是——Qt Sty ...
- setTimeout()和setInterval()小结
写在前面:在写H5游戏时经常需要使用定时刷新页面实现动画效果,比较常用即setTimeout()以及setInterval() setTimeout 描述 setTimeout(code,millis ...
- Javascript基础Function
函数声明与表达式 function someFunc(){ alert("这是一个函数"); } var func=function(){ alert("函数表达式&qu ...
- mongodb 详解 error:10061 由于目标计算机积极拒绝,无法连接解决方法
mongodb下载地址(32位):下载地址 自己选择版本 建立如下与mongodb并行的两个文件夹data和log. 然后建立mongo.config. 在mongo.config配置文件中输入: # ...
- EF数据存贮问题二之“无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象”
“无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象”,这是在EF中,一对多关系表,有外键的类保存至数据库中出现的错误. 我原来是用JAVA开发的,习惯性的处理一对多 ...
- Java------------运算符优先级速记口诀
单目乘加位关系,逻辑三目后赋值. 单目:单目运算符+ –(负数) ++ -- 等 乘加(乘除加减):算数单目运算符* / % + - 位:位移单目运算符<< >> 关系:关系单 ...
- exc_bad_access(code=1, address=0x789870)野指针错误
原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调 ...
- mysql 常用语法
--创建数据库 CREATE DATABASE DB_NAME; --选中数据库 USE DB_NAME; --列出数据库列表 SHOW DATABASES; --删除数据库 DROP DATABAS ...