2012-12-25 2 views
1

나는 꽤 고생했습니다. 여러 파일 (확장자 .dat)이있는 폴더의 내용을 압축해야합니다. 쉘 스크립팅을하러 갔다.파일 이름에 공백이있는 dir의 각 파일을 반복적으로 압축합니다.

지금까지 나는 그렇게 어렵지 않다고 말했다. 나는 단지 파일의 이름을 재귀 적으로 읽고, 파일 이름을 얻고, 파일 자체의 이름을 사용하여 압축해야한다. 이제

for i in *.dat; do zip $i".zip" $i; done 

을 내가하려고하면 이상한 동작을 얻을 :

내가 쓴 각 파일이 "2012년 12월 23일 data102의 test1.dat"처럼라고; 이 일련의 명령을 실행할 때; 전체 파일 이름을 인식하는 대신 zip을보고, 문자열의 각 부분을 단일 엔터티로보고 전체 작업이 실패하도록합니다.

내가 뭔가 잘못하고 있다고 나에게 말했고, 나는 변수가 잘못되었다. 그래서 나는 zip 명령 (i 변수의 출력을보기 위해) 대신 echo를 대체했습니다. $ i 출력은 파일의 일부가 아닌 파일의 전체 이름입니다.

나는이 시점에서 무슨 일이 일어나고 있는지 전혀 모른다. 변수 i가 zip에 의해 읽혀지면 모든 것을 대신하여 문자열의 각 부분을 읽는다. 그 변수의 내용은 올바른 결과를 얻습니다.

다른 방법으로 압축하려면 파일 이름의 값을 전달해야합니까? 매개 변수로 전달 된 변수의 내용이므로 문자열이 하나인지 공백이 있는지는 중요하지 않으며 맨 페이지에서 답변을 찾을 수 없습니다 (거기에 값이있는 경우).).

누구나 왜이 동작을 얻고이를 해결할 수 있는지 알고 있습니다. 감사!

+0

'echo'는 치사한 진단입니다. – tripleee

+0

나는 알고있다. 여러 언어로 된 print 문과 같지만 쉘 스크립트 루프에서 실행되는 동안 변수 값을 출력하는 방법을 모르겠습니다 ... 일시 중지하고 값을 확인할 수있는 IDE가 없습니다. –

+0

아니요, 기본적인 접근 방식은 좋지만 'echo'는 원치 않는 및/또는 오도 된 결과를 낳습니다. 'printf' 또는 자신의 Perl 한 줄짜리를 사용해'ARGV'의 개별 값을 출력하십시오. "가장 효과적인 디버깅 도구는주의 깊게 배치 된 인쇄 문과 함께 신중한 생각입니다." # 브라이언 W. Kernighan – tripleee

답변

1

공백이있는 단어는 따옴표로 묶어야합니다.

zip "$i.zip" "$i" 

일반적으로 쉘이 여러 토큰으로 분할해야하는 경우가 아니면 일반적으로 변수 보간은 큰 따옴표를 사용해야합니다. 내부 필드 구분 기호 $IFS은 기본적으로 공백과 탭이지만 쉘을 임의의 구분 기호로 단어 분할하도록 변경할 수 있습니다. 셸의 인용 메커니즘에 대한 자세한 설명은 알맞은 초보자 용 셸 자습서를 참조하십시오.

+0

자세한 설명을 해주셔서 감사드립니다 ... 나는 $ varname을 넘겨 주면 토큰 화되지 않는다고 가정했습니다. 나는 벽에 머리를 치고 있었다. 지금 나는 그것을 얻는다, 고맙다 !!!!! –

관련 문제