我使用 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