if 절이 작동하지 않는 경우

if 절이 작동하지 않는 경우

아래 코드에서 각 파일을 반복하면서 파일 이름이 소문자 및 특수 문자와 일치하는지 확인하고 20자 미만인지 확인하지만 분명히 내 if 절이 작동하지 않는 것 같습니다. 누구든지 조언을 해줄 수 있나요?

#/bin/bash
Count=$(find . -type f | wc -l)
echo $Count
if [[ ( $Count -ge 2 ) && ( $count -lt 1000 ) ]]
   then
        for file in *;
        do
                if [[ $file == [a-z0-9._-] && ${#file} -le 20 ]];
                echo "inside if $file ${#file}"
           then
                [ -f "$file" ] || continue
                #Check the extension of the file
                ext="${file##*.}"
                #check if the file name is ending with .txt push to text directory
                if [ $ext == "txt" ]
                then
                        mkdir -p text
                        mv $file text
                fi
                #if bash scripts are there push to scripts directory
                if [ $ext == "sh" ]
                then
                        mkdir -p Scripts
                        mv $file Scripts
                fi
                #if log scripts are there push to log directory
                if [ $ext == "log" ]
                then
                        mkdir -p logs
                        mv $file logs
                fi
                #if music files are there push to music directory
                if [[ $ext == "mp3" || $ext == "flac" ]]
                then
                        mkdir -p Music
                        mv $file Music
                fi
          fi
        done
fi

답변1

여기에는 몇 가지 사소한 구문 문제가 있습니다(대부분은shellcheck.net그것을 지적할 것입니다 – 추천합니다! ), 하지만 가장 큰 질문부터 시작하겠습니다.

if [[ $file == [a-z0-9._-] && ${#file} -le 20 ]];
   echo "inside if $file ${#file}"
then
    ...

여기서 첫 번째 문제는 glob 패턴 [a-z0-9._-]일치 입니다.단일 문자. 파일 이름이 한 문자보다 길면 일치하는 항목이 없습니다. 파일 이름에 해당 세트의 문자만 포함되도록 하려면 대신 정규식 테스트를 사용하십시오. ( glob 패턴 일치는 $file =~ ^[a-z0-9._-]+$표현식 [[ ]]내에서 =수행되고 정규식 일치는 수행됩니다.) 길이 검사를 여기에 넣을 수도 있습니다 ( "이전 것의 1에서 20 사이"를 의미).===~$file =~ ^[a-z0-9._-]{1,20}${1,20}

if두 번째 문제는 그 사이에 여러 명령이 있을 때 then그 상태는 다음과 같습니다.마지막 하나표현식이 참 또는 거짓으로 간주되는지 여부를 결정합니다. 명령은 echo거의 항상 성공하므로 표현식은 true이고 then절은 거의 항상 실행됩니다. echo다른 곳으로 옮기거나 완전히 삭제하는 것이 좋습니다 .

이제 작은 질문이 있습니다. shebang(첫 번째 줄)은 #!가 아니라 로 시작해야 합니다 #. Count그리고 count다른 변수입니다(경우가 중요합니다!). 테스트 에서는 이상한 구문 분석을 피하기 위해 [ ]변수를 큰따옴표로 묶어야 하며 ==이는 비표준이므로 대신 사용 하십시오 [ "$ext" = "txt" ].[ $ext == "txt" ]echo "$Count"mv "$file" text

if마지막으로 확장을 추출하는 부분을 단일 명령문으로 대체한 다음 이를 기반으로 일련의 명령문을 사용하고 싶습니다 case(이것이 거의 case의도된 목적입니다).

case "$file" in
    *.txt )
         mkdir -p text
         mv "$file" text ;;

    *.sh )
         mkdir -p Scripts
         mv "$file" Scripts ;;

    *.log )
         mkdir -p logs
         mv "$file" logs ;;

    *.mp3 | *.flac )
         mkdir -p Music
         mv "$file" Music ;;
esac

관련 정보