シェルスクリプトで数値配列を繰り返す方法は?

シェルスクリプトで数値配列を繰り返す方法は?

特定のコマンドを実行した後に生成された配列を繰り返そうとします。使用されるコードは次のとおりです。

#!/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ループが始まる行で「無効な置換」エラーが発生し続けます。

どのシェーバンを使用するか教えてください。

答え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両方のツールが操作を実行し、正規表現が一致したときにスペースで区切られた2番目の列を出力します。cutawkawk

#!/bin/bash

mailx -H | awk '/^ [UN]/ { print $2 }' |
while read msg; do
    print 'msg = %s\s' "$msg"
done

mailxこのユーティリティはUnixシステムで少し違って実装されている非標準ユーティリティなので(-H例:私のバージョンにはオプションはありません)、その使い方についてはもう説明しません。


#!-lineスクリプトを実行しbashて実行可能ファイルをそのパスに配置したい場合は問題ありませんbash(たとえば、通常はLinuxシステムにありますが、システムで確認してください)。command -v bash上記のコードは以下と互換性があり/bin/shません。bash本物これを実行するために必要です(sh同様のシェルで実行できます)。

スクリプトが実行可能であることを確認し、明示的なインタプリタを指定せずに実行してください。

答え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};。今動作します。残りのコードは私の質問と同じです。

関連情報