![如何在 shell 脚本中迭代数字数组?](https://linux22.com/image/139042/%E5%A6%82%E4%BD%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E8%BF%AD%E4%BB%A3%E6%95%B0%E5%AD%97%E6%95%B0%E7%BB%84%EF%BC%9F.png)
我正在尝试迭代执行某些命令后创建的数组。使用的代码是:
#!/bin/bash
mailx -H|grep '^ [UN]'>ListOfMessages.txt
msgNumbers=`cut -c 4-5 ListOfMessages.txt`
echo $msgNumbers
for msg in "${msgNumbers[@]}";
do
echo $msg;
echo $msg|mailx;
done
ListOfMessages.txt 如下所示:
U 5 Sender1 Thu Aug 23 14:28 179/10454 Incident
U 7 Sender2 Thu Aug 23 15:20 179/10456 Incident
U 8 Sender3 Thu Aug 23 15:41 192/10801 Incident
N 9 Sender4 Thu Aug 23 15:45 197/11011 Incident
该数组将根据需要更新为数字 5 7 8 9。我不断收到“错误替换”错误(在 for 循环开始的行处)。
请告诉我要使用的 she-bang。
答案1
据我所知,您的代码中没有数组。该变量msgNumbers
是一个保存命令输出的字符串cut
。
要迭代 的输出cut
,请使用
#!/bin/bash
mailx -H | grep '^ [UN]' | cut -c 4-5 |
while read msg; do
print 'msg = %s\s' "$msg"
done
这将通过管道 ( )将 的输出发送到紧随其后的循环cut
中。该循环将使用set 来迭代 的每一行输出。while
|
while
msg
cut
直接从命令获取cut
数据grep
,这样就无需将数据存储在中间文件或变量中。
我删除了该echo $msg|mailx;
命令,因为它对我来说没有多大意义(该mailx
实用程序需要一个地址来发送数据)。
+也可以替换为一次调用,grep
我们让这两个工具完成工作,并在正则表达式匹配时输出第二个空格分隔的列:cut
awk
awk
#!/bin/bash
mailx -H | awk '/^ [UN]/ { print $2 }' |
while read msg; do
print 'msg = %s\s' "$msg"
done
我不会进一步评论它的使用,mailx
因为它是一个非标准实用程序,在 Unix 系统上的实现略有不同(-H
例如,我的版本没有选项)。
#!
如果您希望脚本被执行bash
并且bash
可执行文件位于该路径(例如,通常位于 Linux 系统上,但请command -v bash
在您的系统上检查以确保),则-line 对我来说看起来没问题。我上面发布的代码与 兼容/bin/sh
,所以bash
不兼容真的需要运行它(它可以在任何sh
类似的 shell 中运行)。
只需确保该脚本可执行并且运行它时无需指定显式解释器。
答案2
不要双引号 msgNumbers 引用,并且 msgNumbers 不是数组,因此索引毫无意义。
答案3
用于()
将值存储为数组。
msgNumbers=(`cut -c 4-5 ListOfMessages.txt`)
echo "${msgNumbers[@]}"
for msg in "${msgNumbers[@]}";
do
echo $msg;
done
答案4
问题解决了。问题是 msgNumbers 不是索引数组。所以我将for msg in "${msgNumbers[@]}";
其更改为for msg in ${msgNumbers};
。现在它可以工作了。其余代码与我的问题中的相同。