2016-11-21 71 views
3

对不起,对subject clone,但鉴于我从这个答案成功使用的技术不能按预期在新脚本上工作,我认为是时候提出一个新问题。如何给bash数组添加值?

不管怎样,下面的脚本是相当直截了当:

missed_symbols=() 

grep missed ${dest}/scribe.log | while read -r line; do 
    symbol=$(echo "${line}" | cut -d' ' -f1) 
    missed_symbols+=("$symbol") 
done 

grep missed ${dest}/scribe_close.log | while read -r line; do 
    symbol=$(echo "${line}" | cut -d' ' -f1) 
    missed_symbols+=("$symbol") 
done 

for symbol in "${missed_symbols[@]}"; do 
    echo "Scribe missed a turn in ${symbol}" 
done 
echo "Scribe missed ${#missed_symbols[@]} turns today" 
exit 0 

并添加-x#!/bin/bash行告诉我说,的确,它是从$missed_symbols[@]分配每个$line的第一个字到$symbol。然而,当我检查${#missed_symbols[@]}时,我得到零。当然,循环它不会产生输出。

那么,我的错字在哪里?

+0

见[BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)。 –

+1

提示:[shellcheck](http://www.shellcheck.net)自动识别许多常见问题[如此](https://github.com/koalaman/shellcheck/wiki/SC2031) –

+1

顺便说一句 - 使用'cut '在这里是不好的形式;我真的应该在早先的答案中纠正这一点,而不是保留它。参见[BashFAQ#100](http://mywiki.wooledge.org/BashFAQ/100),了解bash中字符串操作的良好实践的一般性讨论,或[参数扩展的bash-hackers页面](http:// wiki.bash-hackers.org/syntax/pe)深入讨论我更新的答案现在使用的具体方法。 –

回答

4

管道创建子壳。当子壳体退出时,对子壳体中的壳体变量的更改消失。

因此,代替配管成while read循环,从工艺替代重定向:

while read -r line; do 
    symbol=${line%%" "*} 
    missed_symbols+=("$symbol") 
done < <(grep missed ${dest}/scribe.log)