ログファイルのリストを含むlist.txtファイルがあります。
例えば
server_log1
server_log2
........
server_log50
これらのログのダウンロードに使用する別のシェルスクリプトがあります。それはこのように働きました
./script.sh serverlog1
私はそれを自動的に作成したいと思います。つまり、実行する各ログファイルの名前をlist.txtで自動的に渡すことができます。
それは可能ですか?私は試した
#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done
しかし、それはうまくいきませんでした
引数を読み取る最も簡単な方法は、次のように説明できます。
各引数は、$IFS
または現在定義されているinternal file separator
によって参照および解析されます。デフォルトの文字はスペースです。
たとえば、次のようにします。 # ./script.sh arg1 arg2
この例の引数リストはarg1 = $1
とarg2 = $2
で、arg1 arg2 = $@
に書き換えることができます。
もう1つの注意点は、ログのリストの使用です。どのくらいの頻度で変更されますか?私の仮定は毎日です。ディレクトリ出力を反復ループの配列として使用しないのはなぜですか?例えば;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
さらに良いことに、bashでfunctions
を使用して混乱を解消します。
function process_file()
{
# transfer file code/command
}
function iterate_dir()
{
local -a dir=($(ls $1))
for file in ${dir[@]}; do
process_file $file
done
}
iterate_dir /path/to/log/for
これらはシェルスクリプトの知識を向上させるための提案にすぎませんが、エラーが発生しているかどうかを知る必要があり、各スクリプトのコードや機能の詳細も知っておく必要があります。 -x
引数を使用すると、スクリプトのデバッグにも役立ちます。
ログを転送するだけの場合は、スクリプトをすべて取り除き、rsync
、rsyslog
またはsyslog
を使用することをお勧めします。問題のタスク。
スクリプト内:行を$ REPLY変数として扱うには、while read ; do ......... ; done < filename
のような読み取りループが必要です...
例えば
while read
do
mv $REPLY $REPLY.old
done < liste.txt
liste.txt内のファイル名をfilename.oldに変更します
これで構造が整いました。list-txt内の各ログファイル名の"が意味する内容に応じて、実行する必要があります。" :)
xargs -n 1 ./script.sh <list.txt
この例では、xargs
は、標準入力から読み取られた単一の引数で./script.sh
を複数回実行します。
標準入力は、単純なシェル入力リダイレクトを介してlist.txt
ファイルから取得されます。これは、list.txt
ファイルに、スクリプトで使用する引数が1行に1つ含まれていることを前提としています。
./script.sh
スクリプトは、list.txt
ファイルの行ごとに1回実行されます。
xargs
への-n
フラグについて
-n number
tilityを呼び出す
number
(正の10進整数)の最大引数まで、可能な限り多くの標準入力引数を使用します。
別の解決策は、スクリプトがlist.txt
から直接読み取るか、複数のコマンドライン引数(list.txt
からのエントリ)を取り、ファイルを1つまたは複数のバッチでダウンロードすることです。しかし、スクリプトの仕組みがわからないので、これを実行する方法を詳しく説明することはできません。
(注:私は個人的に Kusalanandaのアプローチ がこの特定のシナリオで最高だと思うので、いくつかの説明情報を追加しますと推奨事項)
for
で行を読み取らないそのアプローチを使用すると:
while
+ read
アプローチが推奨されますが、 これは防弾ソリューションではありません :
_while IFS= read -r line; do
# Your code here
done < file
_
_"$i"
_の代わりに_$i
_を記述します。引用符で囲まれていない変数は、おそらくシェルスクリプトのバグとセキュリティホールの主な原因です。
関連する質問:
`...`
_の代わりに$(...)
を使用します$(...)
はPOSIXに準拠しており、簡単にネストできます。
スクリプトを変更して、複数の引数と_--batch
_オプションをサポートすることもできます。
どこから始めればよいかわからない場合は これらの機能をサポートするサンプル/テンプレートスクリプトがあります (ただし、Bash固有の構文を使用しています)。
使用例:
_$ cat list.txt
list_item_1
list_item_2
list_item_3
$ script --batch list.txt item_1 item_2
Operands:
1: [list_item_1]
2: [list_item_2]
3: [list_item_3]
4: [item_1]
5: [item_2]
_