【问题标题】:How to add values to bash arrays? [duplicate]如何将值添加到 bash 数组? [复制]
【发布时间】:2017-04-05 09:59:43
【问题描述】:

很抱歉subject clone,但鉴于我从该答案中成功使用的技术在新脚本上无法按预期工作,我认为是时候提出一个新问题了。

无论如何,以下脚本相当简单:

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[@]} 时,我得到了零。当然,循环它不会产生任何输出。

那么,我的错字在哪里?

【问题讨论】:

  • BashFAQ #24
  • 提示:shellcheck 自动识别许多常见问题like this
  • 顺便说一句——在这里使用 cut 是不好的形式;我真的应该更早地在我的回答中纠正这一点,而不是保留它。请参阅 BashFAQ #100 了解有关 bash 中字符串操作的良好做法的一般讨论,或参阅 the bash-hackers page on parameter expansion 了解我更新后的答案现在使用的具体方法的深入讨论。
  • 我写的东西几乎总是超级简单,所以我将大量使用 ShellCheck。
  • 谢谢你,查尔斯,你的回答和澄清,即使这是一个骗局。有人给你解决问题所需的代码总是很好的,尽管答案在其他地方以另一种形式出现。

标签: linux bash


【解决方案1】:

管道创建子壳。当这些子shell 退出时,对子shell 中的shell 变量所做的更改就会消失。

因此,不是通过管道进入while read 循环,而是从进程替换重定向:

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

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2020-07-23
    • 1970-01-01
    • 2018-04-14
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多