shell逐行取得字符并赋值给数组
环境是用cygwin假设a.txt如下#:t!:r*:y需求:获取每行“:”前的字符,并赋值到一个数组内。代码如下i=0awk'1'a.txt|whilereadline...
环境是用cygwin
假设a.txt如下
#:t
!:r
*:y
需求:获取每行“:”前的字符,并赋值到一个数组内。
代码如下
i=0
awk '1' a.txt | while read line
do
arr[${i}]=`echo ${line} | awk -F":" '{print $1}'`
done
为什么最后arr里面什么都没有获取到? 展开
假设a.txt如下
#:t
!:r
*:y
需求:获取每行“:”前的字符,并赋值到一个数组内。
代码如下
i=0
awk '1' a.txt | while read line
do
arr[${i}]=`echo ${line} | awk -F":" '{print $1}'`
done
为什么最后arr里面什么都没有获取到? 展开
展开全部
因为你前面使用了管道把数据传给 while,管道会启动一个“子进程”,while是在子进程中执行的,子进程中的变量是不会返回到父进程中的,所以你 while 结束后再看 arr 是空的,因为 while 里的 arr 是子进程的变量。
改成如下就可以了:
i=0
while read line
do
arr[${i}]=`echo ${line} | awk -F":" '{print $1}'`
(( ++i ))
done < a.txt
echo "${arr[@]}"
更多追问追答
追问
原来如此,这个方法不错!
但又出现新问题,这个方法无法把最后一行打出来,按照上面假设的内容,只打印# !,
* 这个没了
有引号的,会不会因为版本的原因,我是cygwin直接vi写的。
如果*:y是最后一行,则*是没有的;
如果*:y下面有一行空行,即打好*:y后按个回车,则是有*的。
所以现在的问题是无论有没有这个回车,# ! *都需要显示。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询