for 루프에 여러 매개변수를 전달하는 방법은 무엇입니까?

for 루프에 여러 매개변수를 전달하는 방법은 무엇입니까?

나는 파일과 동일한 디렉토리에서 작업하고 있습니다. 세 가지 확장자를 가진 파일이 있습니다. 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"

답변2

제가 생각하는 한 가지 방법은 확장명과 일치하는 파일이 아니라 입력을 확장명으로 보내는 것입니다. 문제는 스크립트가 어떤 파일이 어떤 그룹에 속하는지 지워야 한다는 것입니다. 그러면 전역 확장을 위해 내부 확장을 사용할 수 있으므로 루프가 덜 복잡해질 수 있습니다.

현재 가지고 있는 루프는 다음과 같이 while 읽기 루프로 더 잘 작동합니다.

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

또는 다음과 같이:

for i in `ls -1 *`; do ... done >> ps_files.txt

관련 정보