forループに複数のパラメータを渡すには?

forループに複数のパラメータを渡すには?

私はファイルと同じディレクトリで作業しています。 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"

おすすめ記事