私はファイルと同じディレクトリで作業しています。 3つの拡張子を持つファイルがあります。 forループに引数として渡して、特定の拡張子を持つファイルで5つのコマンドのそれぞれを実行したいと思います。
例: 次のコードを実行したいと思います。$my_code.sh *.zap *.F *.T
スクリプトが特定の拡張のすべてのコマンドを実行し、最後にコマンドリストを準備して出力として追加するようにしたいと思います。
コードをそのまま実行すると、最初の引数(* .zapファイルを含むファイルを含む)だけを使用してすべてのコマンドを実行しますが、私が望むのは、拡張子を持つファイルに各コマンドを適用することです。という特定のファイルに。
これは私のコードです。
#!/bin/bash
frequ=$1
tim=$2
zap=$3
ls -1 * |
for i in "$@"; do
echo pav -g \""$frequ"_"avprof.ps/cps"\" -DT $frequ
echo pav -g \""$tim"_"fprof.ps/cps"\" -Gd $tim
echo pav -g \""$tim"_"ds.ps/cps"\" -j $tim
echo pav -g \""$frequ"_"stack.ps/cps"\" -R $frequ
echo psrplot -D \""$zap"_"bp.ps/cps"\" -p freq+ $zap
done >> ps_files.txt
ベストアンサー1
あなたの場合、for
すべてのコマンドを単一のループに入れることは意味がありません。すべてのファイルに共通の操作はありません。各拡張子には独自のコマンドがあり、交差しません。したがって、ある拡張を他の拡張と使用または区別するif
必要があります。switch
私たちはなぜこのようなことをするのですか?各拡張ごとにカスタムループを作成する方が簡単です。
私は拡張をスクリプトに渡さずにコードに直接書くことにしました。また、私はprintf
これがこの作業に適していると選択します。
使用法: ./my_script.sh > ps_files.txt
#!/bin/bash
for i in *.zap; do
printf 'psrplot -D "%s_bp.ps/cps" -p freq+ "%s"\n' "$i" "$i"
done
for i in *.T; do
printf 'pav -g "%s_fprof.ps/cps" -Gd "%s"\n' "$i" "$i"
printf 'pav -g "%s_ds.ps/cps" -j "%s"\n' "$i" "$i"
done
for i in *.F; do
printf 'pav -g "%s_avprof.ps/cps" -DT "%s"\n' "$i" "$i"
printf 'pav -g "%s_stack.ps/cps" -R "%s"\n' "$i" "$i"
done
テスト
私は6つのファイルを作成しました。
$ ls -1
1.F
1.T
1.zap
2.F
2.T
2.zap
出力
# run my script
$ ./my_script.sh > ps_files.txt
# and look at the ps_files.txt content
$ cat ps_files.txt
psrplot -D "1.zap_bp.ps/cps" -p freq+ "1.zap"
psrplot -D "2.zap_bp.ps/cps" -p freq+ "2.zap"
pav -g "1.T_fprof.ps/cps" -Gd "1.T"
pav -g "1.T_ds.ps/cps" -j "1.T"
pav -g "2.T_fprof.ps/cps" -Gd "2.T"
pav -g "2.T_ds.ps/cps" -j "2.T"
pav -g "1.F_avprof.ps/cps" -DT "1.F"
pav -g "1.F_stack.ps/cps" -R "1.F"
pav -g "2.F_avprof.ps/cps" -DT "2.F"
pav -g "2.F_stack.ps/cps" -R "2.F"