.shスクリプトを使用して実行するために複数のパラメータを渡す方法

.shスクリプトを使用して実行するために複数のパラメータを渡す方法

リスト.txtファイルにはログファイルのリストが含まれています。

例えば

    server_log1
    server_log2
    ........
    server_log50

これらのログをダウンロードする別のシェルスクリプトがあります。これがうまくいく方法です。

./script.sh serverlog1

自動で作りたいです。つまり、各ログファイルの名前を自動的に渡すことができます。リスト.txt処刑された。

それは可能ですか?頑張った

#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done

しかし成功はありません。

答え1

パラメータを読み取る最も簡単な方法は次のとおりです。

各パラメータは、$IFS現在定義されているORによって参照され検証されますinternal file separator。デフォルトの文字は空白です。

たとえば、次のように見てください。# ./script.sh arg1 arg2

この例の引数のリストはarg1 = $1andでありarg2 = $2、これで書き換えることができますarg1 arg2 = $@

もう一つの注意はログリストの使用です。このリストはどのくらいの頻度で変更されますか?私の家は毎日です。繰り返しループの配列としてディレクトリ出力を使用しないのはなぜですか?例えば。

for i in $(ls /path/to/logs); do
  ./workaround.sh $i;
done

あるいは、より良い方法は、functions混乱を取り除くためにbashで使い続けることです。

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スクリプトのデバッグにも役立ちます。

ログのみを送信する場合は、スクリプトを完全に削除してくださいrsyncrsyslogsyslog

答え2

xargs -n 1 ./script.sh <list.txt

この例では、標準入力から読み取られた単一の引数を使用して複数回実行されますxargs./script.sh

list.txt標準入力は、単純なシェル入力リダイレクトを介してファイルから提供されます。これはlist.txt、ファイルにスクリプトで使用するパラメータが1行に1つずつ含まれていると想定します。

スクリプトはファイルの各行ごとに1回実行されます./script.shlist.txt


-n国旗についてxargs

-n number

移動する便利number(正の10進整数)引数までできるだけ多くの標準入力引数を使用してください。


別の解決策は、スクリプトがから直接読み取るか、複​​数のコマンドラインlist.txt引数(アイテムからlist.txt)を取得してファイルを一括ダウンロードすることを許可することです。ただし、スクリプトのメカニズムが何であるかわからないため、これを行う方法を詳しく説明することはできません。

答え3

スクリプト内部では、読み込みループが必要です。たとえば、while read ; do ......... ; done < filename行を$ REPLY変数として扱います。

例えば

while read 
do
mv $REPLY $REPLY.old
done < liste.txt

liste.txt のすべてのファイル名を filename.old に変更します。

これで構造が完成したので、必要に応じてニーズに合わせて調整できます。"list.txtで実行される各ログファイルの名前で。" :)

答え4

質問を誤って読んだ可能性がありますが、私が読む方法は、プライベートスクリプトに複数のパラメータを使用させる方法です。たとえば、wgetは "wget url1 url2 url3"を実行できます。

スクリプト全体を「マイスクリプトの行」とマークされた場所に貼り付け、このファイルを新しいスクリプトとして保存します。

ARGUMENTS=$(echo "$@"| tr " " "\n") ; while read A; do "lines from my script";done < "$ARGUMENTS"

スクリプトが$ 1を参照している場合は、それを$ Aに変更し、もちろん他の参照も確認する必要があります。

パラメータは、$ @という変数で区切られた1行のスペースに格納されます。このハッキングはtrを使用して行をラップし、ARGUMENTSという新しい変数に保存します。残りのスクリプトは、その変数の各行に対してスクリプトを実行します。

私は私のbash Webスクレーパーが単一のパラメータを持つ複数のURLを許可するようにこれを書いています。したがって、通常、複数のパラメータを受け入れるスクリプトでは機能しない可能性があります。

関連情報