아래와 같이 for 루프를 사용하여 함수에 매개변수를 전달하여 파일을 하나씩 읽으려고 합니다. 매개변수 3은 파일 이름에 공백이 있기 때문에 많은 문제를 일으킬 수 있습니다.
예:
source_file_restructure()
{
echo "inside the function"
source_folder=$1
target_folder=$2
file_pattern=$3
delimiter=$4
echo $file_pattern
echo " Getting inside the function.... "
for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
do
some processing.......
done
위의 ls 명령은 파일에 공백이 포함된 경우(예: 파일 1.csv) 제대로 작동하지 않습니다.
입력하다:
SOurce Folder : /home/test/
File Pattern : "file"
Function argument :
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}
이 문제를 해결하기 위한 몇 가지 옵션을 제안하십시오.
답변1
바꾸다
for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
그리고:
for file_name in "${source_folder}"*"${file_pattern}"*.csv
위의 첫 번째 형식과 같이 역따옴표 안의 명령 출력은 단어 분리의 영향을 받습니다. 위의 두 번째 형식은 백틱을 사용하지 않습니다. 반면에 공백, 탭, 줄 바꿈 또는 기타 어려운 문자가 포함된 파일 이름을 포함하여 모든 파일 이름을 처리할 수 있습니다.
또한, 교체
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}
그리고
source_file_restructure "${source_folder}" "${target_folder}" "${file_pattern}" "${delimiter}"
큰따옴표가 없으면 쉘은 단어 분리를 수행합니다. 큰따옴표를 사용하면 공백, 탭, 줄 바꿈 또는 기타 어려운 문자가 있어도 source_folder
함수 가 올바르게 호출됩니다 .target_folder
답변2
첫 번째 스크립트에서 다음 환경 변수를 설정해야 합니다.
IFS=$(echo -en "\n\b")
답변3
내 스크립트 중 하나에서 다음과 같은 것을 사용하고 있습니다.
ls -Q "$folderToRead" | while read file # ls -Q puts every entry between quotes : "file".
do
file=`echo $file | tr -d '"'` # This erases the quotes from the -Q argument, so you
# can work on the file without worrying about it.
물론 스크립트에서 실행하려면 ls 명령을 편집해야 합니다. 그냥 짧은 버전으로 썼습니다.