我有一个需要迭代的多行字符串,但我没有使用 bash。建议?

我有一个需要迭代的多行字符串,但我没有使用 bash。建议?

我使用 Dash 是因为它要在我的 rPi 上运行。 Bash 不是一个选择。

我正在重写 Bash 脚本以与 Dash 一起使用。我希望使其尽可能符合 POSIX 标准(可移植)。问题是很难找到关于如何通过不涉及 Bash 的多行字符串进行循环的帮助。

我的脚本一直有效,直到我必须遍历 100 到 1000 个设备的列表,每个设备在文本文件中各占一行。例如,该文件可能类似于:

foo
bar
device
blah

cat我使用一个简单的命令导入单词: LIST="$(cat $2)"。从这里我需要循环遍历中的每个单词$LIST

for ARRAY in ${LIST}
do
    printf "Getting VLANS for: $ARRAY"

    VLANS=$(snmpbulkwalk -v 2c -t 2 -r 3 -c "$COMMUNITY" "$ARRAY.dcs.byu.edu" XIRRUS-MIB::vlanName -Oqv)
    printf "$ARRAY,$VLANS" >> "$REPORT"
done

当循环开始时,$ARRAY几乎会打印出所有内容$LIST,这实际上使其变得毫无意义。仅存储一个单词至关重要,$ARRAY因为snmpbulkwalk一次只能处理一台设备。它将返回所有数据作为一个多行字符串,但是可以使用sed逗号替换每个换行符来轻松处理这一点。

所以,迭代字符串中每个单词的正确和/或有效的方法是什么?据我了解,数组在达世币中几乎不存在,这使得突变变得更加困难。我尝试过使用Ubuntu 指南这个非常有用的参考。当我写这篇文章时,我开始认为我可能必须尝试使用grep​​逐行读取并嵌套另一个 for 循环,但我不确定是否有更简单、“干净”的方法。


你们太棒了!快速、干净的回应和一些例子。

因此,我创建了两个不同版本的脚本,它们都可以完美运行。第一个是按照 roaima 的概述完成的,也是 Steeldriver 的建议。我用一个循环替换了循环,while它会逐行读取我的文件。谢谢您,这确实有助于简化事情,并表明在我的情况下不需要数组。

我的第二个版本只是替换printf "Getting VLANS for: $ARRAY"echo "Getting VLANS for: $ARRAY",最终我将其删除,看看会发生什么。不知何故,这造成了所有的不同:ARRAY没有包含LIST允许其余代码正常工作的所有内容。如果有人想进一步澄清这是如何工作的,请在评论中这样做。

再次感谢大家!它的运行速度比以前在 Bash 上快得多。snmp剩下的就是进行一些解析数据的调整!

答案1

这就是我从文件中一次读取一行的方法

while IFS= read -r DEVICE
do
    ....
done < your_file

相关内容