다음은 내 문제를 더 잘 이해할 수 있도록 내 코드의 작은 발췌문입니다. 디렉터리의 각 파일이 루프에 진입하면 파일 이름에서 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_range
cd
month_range
cd
wd=$PWD; cd Em1 && { month_range; cd "$wd"; }
위의 내용은 변수 month_range
가 변경되거나 설정 해제되지 않았다고 가정합니다 wd
.
awk
Unix의 파일 이름에는 기술적으로 개행 문자가 포함될 수 있으므로 사용법에 문제가 있습니다. 매개변수 대체를 사용하는 것이 더 좋습니다.
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
함수나 스크립트에 따라 다릅니다.