if else 조건을 사용하여 디렉토리 변경

if else 조건을 사용하여 디렉토리 변경

다음은 내 문제를 더 잘 이해할 수 있도록 내 코드의 작은 발췌문입니다. 디렉터리의 각 파일이 루프에 진입하면 파일 이름에서 em 값을 추출하고 선언된 em 값과 비교하여 다음 작업을 수행합니다. 코드를 실행한 후 첫 번째 조건이 작동하는 것을 확인했지만 Em1 디렉터리에서 나올 때 두 번째 조건은 더 이상 확인되지 않습니다. Em2 디렉터리를 열었는데 파일이 있는 동안 비어 있었기 때문입니다. em2 값으로. 그래서 무엇이 문제인지 알고 싶습니다.

em1="first"
em2="second"
for file in *;
do
em=$( echo "$file" | awk -F'[.-]' '{print $1}' )
if [[ "$em" == "$em1" ]];
 then
   cd Em1                    #directory to execute action
   month_range               #function for action
   cd_ret                    #function to come back to current directory
elif [[ "$em" == "$em2" ]];
  then
   cd Em2
   month_range
   cd_ret
else
  echo "Nothing to do"
fi
done

답변1

for루프 헤더에 변수 이름을 사용해야 합니다 . $file원래 질문에 변수 값을 사용 했습니다 file.

당신이하고있는 일은 약간 복잡합니다. 임시로 변경된 작업 디렉토리로 명령을 실행하려면 서브셸을 사용할 수 있습니다.

( cd Em1 && month_range )

cd서브쉘 외부의 작업 디렉토리는 서브쉘 내부의 작업 디렉토리에 영향을 받지 않습니다 . 함수가 수행하는 작업 이 명확하지 않으므로 cd_ret이는 오류의 또 다른 원인일 수 있습니다. 예를 들어 month_range원래 범위에서 표시되어야 하는 변수를 설정하는 경우와 같이 이 작업을 수행할 수 없는 경우 다음을 사용하십시오.

cd Em1 && { month_range; cd -; }

위의 코드는 를 cd입력 Em1하고 함수를 실행 month_range한 다음 더 이상 호출이 이루어지지 않는다는 cd가정 하에 반환됩니다 . 그렇다면 현재 작업 디렉토리 를 변수에 저장하고 이를 사용하십시오.month_rangecdmonth_rangecd

wd=$PWD; cd Em1 && { month_range; cd "$wd"; }

위의 내용은 변수 month_range가 변경되거나 설정 해제되지 않았다고 가정합니다 wd.

awkUnix의 파일 이름에는 기술적으로 개행 문자가 포함될 수 있으므로 사용법에 문제가 있습니다. 매개변수 대체를 사용하는 것이 더 좋습니다.

em=${file%%[.-]*}

$file위의 코드는 먼저 값 -이나 .문자를 자르고 결과 문자열을 변수에 할당합니다 em.

이로 인해 다음이 남습니다.

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        if [ "$em" = "$em1" ]; then
                ( cd Em1 && month_range )
        elif [ "$em" = "$em2" ]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

또는

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        case $em in
                "$em1") ( cd Em1 && month_range ) ;;
                "$em2") ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

아니면 전혀 em추출 하지 마세요 $file.

em1=first
em2=second

for file in *; do
        case $file in
                "$em1"[.-]*) ( cd Em1 && month_range ) ;;
                "$em2"[.-]*) ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

또는 bash구문을 사용하십시오.

em1=first
em2=second

for file in *; do
        if [[ $file == "$em1"[.-]* ]]; then
                ( cd Em1 && month_range )
        elif [[ $file == "$em2"[.-]* ]]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

이것이 예상한 결과라면 month_range함수나 스크립트에 따라 다릅니다.

관련 정보