como passar muitos argumentos para for loop?

2

Estou trabalhando no mesmo diretório dos arquivos. Eu tenho arquivos com três extensões diferentes. Eu quero executar cada um dos cinco comandos em um arquivo com a extensão específica passando-os como argumentos para o loop for.

exemplo: Eu quero quando eu executar o código como: $my_code.sh *.zap *.F *.T
Eu quero que o script execute cada comando na extensão específica e prepare uma lista de comandos no final e anexe-os como saída.

Quando eu executo o código como está, ele pega apenas os primeiros argumentos (que contém arquivos com arquivos * .zap) e executa todos os comandos nele, mas o que eu quero é aplicar cada comando em arquivos específicos com extensão .

aqui está o meu código:

#!/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 
    
por abubakr yagob 15.10.2017 / 19:58

2 respostas

2

Não faz sentido colocar todos os comandos no único loop for , no seu caso. Você não tem ações comuns para todos os arquivos - cada extensão possui comandos próprios e eles não interceptam. Assim, você precisará usar if ou switch para distinguir uma extensão da outra. Por que isso? Será mais fácil criar um loop personalizado para cada extensão.

Eu decidi não passar extensões para o script, mas escrevê-las diretamente no código. Além disso, escolhi printf - é mais adequado para esta tarefa.

Uso: ./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

Teste

Eu criei seis arquivos:

$ ls -1
1.F
1.T
1.zap
2.F
2.T
2.zap

Resultado

# 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"
    
por 16.10.2017 / 02:24
0

Uma maneira de melhorar isso é se você enviar a entrada apenas para a extensão, não para os arquivos que correspondem à extensão. O problema é que seu script teria que eliminar quais arquivos pertencem a qual grupo. As alças podem se tornar menos complexas, já que você pode fazer a expansão glob com a extensão para dentro.

O loop que você tem atualmente funcionaria melhor como loop de leitura, assim:

ls -1 * | while read i; do ... done >> ps_files.txt

ou como para, assim:

for i in 'ls -1 *'; do ... done >> ps_files.txt
    
por 15.10.2017 / 20:13