特定のコマンドを実行した後に生成された配列を繰り返そうとします。使用されるコードは次のとおりです。
#!/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
|
while
msg
cut
コマンドから直接cut
データをインポートするためgrep
、中間ファイルや変数にデータを保存する必要はありません。
echo $msg|mailx;
このコマンドは私にとってあまり意味がないので削除しました(mailx
ユーティリティにはデータを送信するアドレスが必要です)。
+は単一の呼び出しに置き換えることもできます。ここでは、grep
両方のツールが操作を実行し、正規表現が一致したときにスペースで区切られた2番目の列を出力します。cut
awk
awk
#!/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};
。今動作します。残りのコードは私の質問と同じです。