forループ内でbashスクリプトを実行し、forループから変数値を取得します。

forループ内でbashスクリプトを実行し、forループから変数値を取得します。

入力ファイルを取得して処理し、出力ファイルを表示するbashコードがあります。ただし、ディレクトリ内の特定の拡張子(.wfx)を持つすべてのファイルでコードを実行したいと思います。 1,2,3...100.wfxファイル(100個の.wfxファイル)があり、一度に出力を取得したいとします。元のbashスクリプト(grep、awk、およびsedが多く除外されています)は次のとおりです。

system_name="1"
wfxfile=${system_name}.wfx
.
.
.
echo "id1 id2 " > ${system_name}_energies.txt

上記のコードはうまくいくので、変更したくありません。スクリプト名は extract_value.sh です。入力ファイル名に "system_name"変数を使用してforループを使用できる場合は、目標を達成できると思いました。だから、スクリプトをほとんど変更しませんでした。

system_name="$i"
wfxfile=${system_name}.wfx

私は次のことを試しています。

for i in *.wfx; do system_name="{$i}"; echo $system_name; ./extract_value.sh;done

私が得るのはこれです

10_1.wfx
grep: .wfx: No such file or directory
10_2.wfx
grep: .wfx: No such file or directory
10.wfx
grep: .wfx: No such file or directory
11_1.wfx
grep: .wfx: No such file or directory
11_2.wfx
grep: .wfx: No such file or directory
1_1.wfx
grep: .wfx: No such file or directory
11.wfx
grep: .wfx: No such file or directory
12_1.wfx
grep: .wfx: No such file or directory
12_2.wfx
grep: .wfx: No such file or directory
1_2.wfx
grep: .wfx: No such file or directory

問題は間違いなくループ内で変数を誤って使用したようです。しかし、助けてくれてありがとう。

答え1

export実行中のシェルプロセスの環境で表示できるように、シェルから変数を取得するか、コマンドライン引数として渡す必要があります。エクスポートされていないシェル変数は、同じシェルインスタンス内でのみ表示されます。

たとえば、mytest.sh は次のようになります。

#!/bin/sh
echo "cmdline arg: '$1', envvar: '$sysname'"

それから:

for i in abc def ghi; do
    export sysname="$i"
    ./mytest.sh "$i"
done

内部スクリプトに変数をsysname="$1" ./mytest.sh渡す環境を使用することもできます。sysnameいいえシェルで設定します。

答え2

スクリプトに小さな変更が1つありますが、他の変更を提案してもよいですか?

改行

system_name="$i"

到着

system_name="$1"

次にループを実行します。

for i in *.wfx; do
    [[ ! -f "${i}" ]] && break
    ./extract_value.sh "${i}"
done

チェックは、-fそのファイルが存在しない場合のものです。シェルは*.wfx文字通りiを設定します。ループとスクリプトの主な変更点は、ファイル名を渡して最初の場所引数として受け入れることです。

関連情報