アプリケーションと対話するBashスクリプト

アプリケーションと対話するBashスクリプト

実際のアプリケーションのスキャンプロセスを自動化しようとしています。私のスクリプトは

#!/bin/bash

i=1
file="ATLASbins.txt"
while IFS= read line 
do
    scan=$line
    cat test.sh | sed     "s/ set vchi 5000/ set vchi $scan/g" > test2.sh
    chmod +x test2.sh
    bash -x  /home/mario/Mine/test2.sh
    i=$((i + 1))
done <"$file"

test2.shは、スキャンを実行するアプリケーションを起動する別のスクリプトです。 2番目のスクリプトの内容の例は次のとおりです。

#!/bin/bash
/home/mario/mg5/bin/mg5_aMC

"import model Implementation"

"generate u++ > l+ l+"

output firstscript$i

set vchi 6500

launch firstscript$i

ここで、「モデルのインポート」、「出力」、および「開始」はアプリケーションのコマンドです(ターミナルで実行)。

アプリケーション内部のコマンドが機能せず、次の行が表示されます。

PATH/test2.sh:行5:インポートモデルの実装:コマンドが見つかりません。

私はこれを行う方法(たとえば、アプリケーションにコマンドを書くことができるスクリプトを書く)を知らず、さまざまな区切り文字を試して、別のシェルでtest2スクリプトを実行し、端末を使用して新しい端末(dwarf)から呼び出しました。どうすればいいですか?

もう1つの観察は、アプリケーション内にiの変数値を作成する必要があることです。 "output firstscript $ i"のようにこのように書いてみましたが、コマンドが動作しても動作しないようです。

答え1

test2.sh別のシェルスクリプトとして実行しているため、シェル変数は使用iできません。これはスクリプトの拡張子が空で$iあることを意味しますtest2.sh。この問題は2つの方法で解決できます。

  1. 最初のスクリプトでi環境変数を作成します。export iこれは便利ですが、一般的なケースでは良い解決策ではありません。これは、他のスクリプトがi呼び出しスクリプトの変数値とは無関係な独自の変数を使用したいという誘惑を受ける可能性があるためです。

  2. スクリプトを呼び出すと、スクリプトのコマンドラインから次のように $iなります。これにより、as(最初のコマンドライン引数)の値にアクセスできます。test2.shtest2.sh "$i"$itest2.sh"$1"

2番目の問題は、mg5_aMCプログラムが入力、つまりスクリプトにリストされているコマンドを期待していることです。ただし、これらの項目を入力する方法は、次のtest2.shように処理されることを意味します。シェルコマンド。スクリプトのどれもプログラムに特別な制御コマンドを渡しません。

受け取ったエラーが示すように、コマンドが見つからないと文句を言うのはシェルです。これはシェルコマンドではないので(解釈する方法を知っていれば)これは驚くべきことではありません。


あなたのmg5_aMCプログラムが標準入力から読むと仮定すると、私はあなたのプログラムが実行されるたびにシェルスクリプトを書かずに、代わりに入力制御/コマンドファイルを提供します。

#!/bin/bash

file="ATLASbins.txt"

i=1
while IFS= read -r scan 
do
    sed -e "s/@scan@/$scan/" \
        -e "s/@i@/$i/" \
        input-template.in >input.in

    /home/mario/mg5/bin/mg5_aMC <input.in

    i=$((i + 1))
done <"$file"

ここでファイルはinput-template.in次のようになります。

"import model Implementation"
"generate u++ > l+ l+"
output firstscript@i@
set vchi @scan@
launch firstscript@i@

私はシェルスクリプトの呼び出し@thing@で置き換えられるsedタスクにそれを使うことにしました。

これは、値にコマンドを妨げる文字(たとえば)が$scan含まれていないと仮定します。sed/


プログラムの制御スクリプトがかなり短い場合、別のアプローチは、「ここの文書」を使用してプログラムに制御コマンドを入力することです。

#!/bin/bash

file="ATLASbins.txt"

i=1
while IFS= read -r scan 
do
    /home/mario/mg5/bin/mg5_aMC <<END_INPUT
"import model Implementation"
"generate u++ > l+ l+"
output firstscript$i
set vchi $scan
launch firstscript$i
END_INPUT

    i=$((i + 1))
done <"$file"

<<TAGここでのドキュメントは、デフォルトではファイルには提供されず、末尾と末尾の間に提供されるテキストフラグメントのリダイレクトタイプですTAG。テキストの変数(上記のように作成された場合)は、コマンドに入力される前にシェルによって拡張されます。

関連情報