for filename in *
do
if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
then
echo "$filename"
fi
done
위는 현재 저장소의 파일을 확인하고 "even" 및 "odd" 이외의 이름을 가진 파일을 출력하는 간단한 쉘 스크립트입니다.
작동하지 않습니다
답변1
비교 연산자 -ne
는산수연산자를 테스트합니다. 즉, 정수만 비교합니다.
i=7
if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
echo 'i is neither 6 nor 8'
fi
비교하다끈불평등의 경우 다음을 사용하십시오 !=
.
if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
printf '"%s" is neither of the strings "even" or "odd"\n' "$filename"
fi
또는 다음을 사용하십시오 case
.
case "$filename" in
even|odd)
# the filename is "even" or "odd"
;;
*)
# the filename is neither "even" nor "odd"
printf '%s\n' "$filename"
esac
또한 *
일반 파일 이름뿐만 아니라 현재 디렉터리의 모든 이름과 일치합니다. 루프에서 일반 파일만 처리하려면 다음을 사용하세요.
for name in *; do
if [ ! -f "$name" ] || [ -L "$name" ]; then continue; fi
# other code here using "$name"
done
이 continue
문은 루프의 다음 반복으로 점프합니다. -f file
조사하다정기적인문서뒤쪽에심볼릭 링크 확인을 통해 다음 유형의 파일을 원하는 경우심볼릭 링크일반 파일을 가리키는지 여부에 관계없이 제외하려면 추가 || [ -L "$name" ]
.
답변2
줄을 if
다음으로 변경합니다.
if [ "$filename" != even ] && [ "$filename" != odd ]
bash
셸 에서 전체 스크립트(즉for
에서 포함까지 ) done
이는 다음과 같이 단순화될 수 있습니다.
GLOBIGNORE=even:odd ; printf "%s\n" *
또 다른 bash
방법:
shopt -s extglob # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)
답변3
또는 -a를 사용한 괄호 쌍
for filename in *
do
if [ "$filename" != even -a "$filename" != "odd" ]
then
echo "$filename"
fi
done
또는
for filename in *
do
case "$filename" in
(even|odd) ;;
*) echo "$filename" ;;
esac
done
답변4
find -maxdepth 1 -not -name even -not -name odd
아마도 가장 짧은 솔루션일 것입니다. 비록 긴 "-maxlength 1"이 있더라도 디렉토리 리프에서는 이를 생략할 수 있습니다.
각 파일에 대해 프로그램을 호출하는 것은 매우 간단합니다.
find -maxdepth 1 -not -name even -not -name odd -exec wc {} ";"
(wc에서 볼 수 있듯이 중괄호를 사용하여 파일 이름을 예상합니다. 이는 GNU-find에 의존합니다.)