나는 KSH를 가지고 있습니다 (큰 타격은 아니다) 선점된 스크립트를 파일 개수로 확인하고 싶습니다. 파일이 없으면 "EMPTY"를 인쇄하고 종료하고 싶습니다. 그렇지 않으면 계속하십시오.
문제는 파일 개수를 계산할 때 파일이 비어 있다가 중단된다는 것입니다.
암호:
###################################################
# Test to see if files exist in Drop Folder
###################################################
CONTENTS=$(ls ${gp_path}ALLSTUFF*.zip)
if [[ ${#CONTENTS[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
비어 있지 않으면 유효합니다.
비어 있으면 다음 오류가 발생하고 시스템이 충돌합니다. EMPTY를 보고하고 0으로 종료되기를 원합니다.
실수:
/nas/Opt/databox/folder/ALLSTUFF*.zip not found
내가 뭘 잘못했나요?
시도 #2
나도 이것을 시도했지만 같은 결과를 얻었습니다.
if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
print 'NOT EMPTY'
else
print 'EMPTY'
exit 0
fi
답변1
Kusalananda의 답변에 대한 Stéphane Chazelas의 의견에 대한 후속 조치:
$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv TABLE2.csv
파일을 저장하려면 배열을 사용하세요. 일부 파일과 일치하는 glob 표현식으로 시작합니다.
$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)
이제 일치하지 않는 "네이키드" glob은 일치하지 않는 glob이 glob 패턴에 의해 문자열로 대체됨을 보여줍니다.
$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')
이제 "null glob"이라는 접두사가 붙습니다.
$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$
ksh 매뉴얼 페이지의 파일 이름 생성 섹션을 참조하십시오.
귀하의 질문에 구체적으로 답변하려면 다음을 수행하십시오.
typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
변수 이름을 모두 대문자로 사용하는 습관을 버려야 합니다.
답변2
2>/dev/null
에서 오류 메시지를 만들 수 있습니다 ls
.
$CONTENTS
그러면 비어 있는지 확인할 수 있습니다.-z
CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
답변3
파일 이름 패턴이 어떤 것으로 확장되는지 감지하려면 다음을 사용할 수 있습니다.
set -- "$gp_path"ALLSTUFF*.zip
if [ -e "$1" ]; then
echo matched something
else
echo did not match anything
exit 1
fi
이 set
명령은 패턴과 일치하는 파일 이름에 위치 인수를 설정하고, 첫 번째로 일치하는 파일 이름이 있으면 무엇인가와 일치합니다. 패턴이 일치하는 항목이 없으면 패턴은 확장되지 않은 상태로 유지됩니다.
ksh
이는 , bash
및 기타 sh
유사한 셸 에서 사용할 수 있습니다 .