如何在 shell 脚本中迭代数字数组?

如何在 shell 脚本中迭代数字数组?

我正在尝试迭代执行某些命令后创建的数组。使用的代码是:

#!/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|whilemsgcut

直接从命令获取cut数据grep,这样就无需将数据存储在中间文件或变量中。

我删除了该echo $msg|mailx;命令,因为它对我来说没有多大意义(该mailx实用程序需要一个地址来发送数据)。

+也可以替换为一次调用,grep我们让这两个工具完成工作,并在正则表达式匹配时输出第二个空格分隔的列:cutawkawk

#!/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};。现在它可以工作了。其余代码与我的问题中的相同。

相关内容