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