Linux 如何向bash数组添加值?

Linux 如何向bash数组添加值?,linux,bash,Linux,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_cl

很抱歉,但是考虑到我在这个答案中成功使用的技术在新脚本中没有达到预期效果,我想是时候提出一个新问题了

无论如何,下面的脚本相当直接:

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
行告诉我,实际上,它是将每个
$line
的第一个单词从
$missed_symbols[@]
分配到
$symbol
。然而,当我检查
${#missed_symbols[@]}
时,我得到零。当然,通过它循环不会产生任何输出


那么,我的输入错误在哪里呢?

管道创建子shell。在子shell中对shell变量所做的更改在这些子shell退出时消失

因此,在读取循环时,不要将管道连接到
,而是从流程替换重定向:

while read -r line; do
  symbol=${line%%" "*}
  missed_symbols+=("$symbol")
done < <(grep missed ${dest}/scribe.log)
读取-r行时
;做
symbol=${line%%”“*}
缺少符号+=(“$symbol”)

完成cut
是不好的形式;我真的应该早点在我的回答中纠正这一点,而不是保留它。有关bash中字符串操作的良好实践的一般性讨论,或有关我更新的答案目前使用的具体方法的深入讨论,请参阅。我编写的内容几乎都非常简单,因此我将大量使用ShellCheck。感谢Charles的回答和澄清,尽管这是个骗局。当有人给你解决问题所需的代码时,这总是很好的,尽管答案以另一种形式存在。