ファイルの内容を1行ずつ使用して実行します。

ファイルの内容を1行ずつ使用して実行します。

ファイル.txt

servername1:DBNAME1:/u01/app
servername2:DBNAME2:/u01/dbs
servername3:DBNAME3:/u01/app1

上記のファイルの内容を1行ずつ使用してシェルスクリプトで実行したい

command1 hostname=servername1 db=dbanme1 location=/u01/app 
command2 hostname=servername1 db=dbanme1 location=/u01/app

上記のコマンドの後、2番目の行の値を取得して実行する必要があります。

答え1

while IFS=':' read -r hostname db location
do
    set -- hostname="$hostname" db="$db" location="$location"
    command1 "$@"
    command2 "$@"
done <file.txt

または、位置パラメータを保存する必要がある場合

while IFS=':' read -r hostname db location
do
    command1 hostname="$hostname" db="$db" location="$location"
    command2 hostname="$hostname" db="$db" location="$location"
done <file.txt

どちらもfile.txt1行ずつ読み取られ、各行に分かれた3つのフィールドが3つの変数と:読み込まれます。行にさらに - で区切られたフィールドがある場合、そのフィールドは値に追加されます。hostnamedblocation:location

その後、コマンドを実行します。

答え2

使用GNUパラレル:

$ parallel --colsep ":" 'command1 hostname={1} db={2} location={3}; command2 hostname={1} db={2} location={3}' :::: file.txt 

file.txtコマンドのすべての行に対して実行されます。 、、、が列の値に置き換えられるように、行が分割され:ます。{1}{2}{3}

プロセスはparallel並列に開始されます。デフォルトでは、並列に実行されるジョブの数はコア数です。並列に実行できるジョブの数を指定できます-j-k行が実行された順序で出力を維持する必要がある場合は、このパラメーターを使用してください。

関連情報