내 첫 번째 쉘은 각 파일의 줄 수를 계산합니다.

내 첫 번째 쉘은 각 파일의 줄 수를 계산합니다.

각 파일의 줄 수를 계산하기 위해 쉘 스크립트를 실행하려고 하는데, 줄 수가 2보다 작으면 다른 디렉터리로 이동해야 합니다.

껍데기:

#!/bin/bash


foreach i in (ls *.DAT)
  a=`wc -l $i`
  if $a=<2 then
    mv $i aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup      
  endif
end

하지만 내 쉘에 오류가 발생했습니다.

igud_to_backup.sh: 8행: 예상치 못한 표시 "(" 근처에 구문 오류가 있습니다.

igud_to_backup.sh: 8행: `foreach i in (ls *.DAT)'

쉘 스크립트에 어떤 문제가 있나요?

답변1

많은 문제가 있습니다:

  • foreachbash 키워드가 아님: 사용for
  • 명령을 실행하려면 $( ... )대괄호 대신 사용하십시오.
  • 괄호 안의 명령은 실행할 필요가 없으며 쉘을 사용하여 확장할 수 있습니다 for i in *.DAT; do(일반적으로 다음을 참조하십시오).왜 `ls`를 구문 분석하지 *않나요*?)
  • 값이 다음보다 작거나 같은지 테스트합니다( 참조 man test).if [ $a -le 2 ] ; then
  • fora는 다음으로 끝나며 그렇지 않음doneend
  • an은 다음 if으로 끝나며 fi그렇지 않음endif
  • 파일 이름을 매개변수로 지정하면 wc줄 수를 인쇄합니다.그리고파일 이름. 표준 입력에서 <읽기wc

요약하다:

#!/bin/sh
for i in *DAT; do
  a=$( wc -l < "$i" )
  if [ "$a" -le 2 ] ; then
    mv "$i" aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
  fi
done

답변2

Matteo가 ​​언급했듯이 Perl 구문을 사용하려고 합니다. 해야 한다;

for i in $(ls *.DAT); do
  if [ $(wc -l ${i}) -le 2 ]; then
    mv ${i} /path/to/
  fi
done

관련 정보