入力ファイルを取得して処理し、出力ファイルを表示する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を設定します。ループとスクリプトの主な変更点は、ファイル名を渡して最初の場所引数として受け入れることです。