각 파일의 줄 수를 계산하기 위해 쉘 스크립트를 실행하려고 하는데, 줄 수가 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
많은 문제가 있습니다:
foreach
bash 키워드가 아님: 사용for
- 명령을 실행하려면
$( ... )
대괄호 대신 사용하십시오. - 괄호 안의 명령은 실행할 필요가 없으며 쉘을 사용하여 확장할 수 있습니다
for i in *.DAT; do
(일반적으로 다음을 참조하십시오).왜 `ls`를 구문 분석하지 *않나요*?) - 값이 다음보다 작거나 같은지 테스트합니다( 참조
man test
).if [ $a -le 2 ] ; then
for
a는 다음으로 끝나며 그렇지 않음done
end
- 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