2011-08-25 2 views
14

나는 bash 스크립트를 사용하여 파일 이름을 사용하여/tmp /에 새 폴더를 만든 다음 그 폴더 안에 파일을 복사합니다.bash 스크립트에 기본 이름이 공백이 있습니까?

#!/bin/bash 

MYBASENAME="`basename $1`" 
mkdir "/tmp/$MYBASENAME" 

for ARG in "[email protected]" 
    do 
     mv "$ARG" "/tmp/$MYBASENAME" 

done 

행동 : 나는 mymove "/home/me/downloads/my new file.zip" 입력하면

는이 보여줍니다

mkdir /tmp/my 
new 
file.zip 
mv: rename /home/me/downloads/my new file.zip to /tmp/my\nnew\nfile.zip: 

내가 다 따옴표를 많이, 그래서이 예상대로 작동하지 않는 이유를 이해하지 않습니다 .

또한 여러 파일이있는 경우 양식 루프가 있습니다. 첫 번째 인수의 기본 이름을 기반으로 모두 동일한 폴더에 복사하려고합니다.

답변

12

할당이 단일 명령 대체 인 경우 명령 대체를 인용 할 필요가 없습니다. 쉘은 변수 할당에 대해 단어 분리를 수행하지 않습니다.

MYBASENAME=$(basename "$1") 

모두입니다. 대신 역 따옴표의 $()를 사용하는 습관을해야 더 쉽게 (이 BTW, POSIX, 그리고 모든 현대적인 포탄을 지원합니다..)

PS $() 둥지 때문에 : 당신은 하지 쓰기 떠들썩한 파티에 시도해야 스크립트 . 스크립트를 작성하십시오. 차이점은 bashisms, zshisms 등이 없다는 것입니다. C와 마찬가지로 이식성이 스크립트의 원하는 기능입니다 (특히 쉽게 달성 할 수있는 경우). 스크립트는 bashisms를 사용하지 않으므로 대신 #!/bin/sh을 작성합니다. nit picker의 경우 : 예, 알고 있습니다. 오래된 SunOS와 Solaris /bin/sh$()을 이해하지 못하지만 /usr/xpg4/bin/sh은 POSIX 쉘입니다.

+0

많은 기본 쉘 스크립트가 bash 대신 sh를 사용합니다.새로운 줄을 보이지 않게하기 위해서'echo \ c' 같은 것을 제외하고는 여전히 차이점을 너무 많이 말할 수 없습니다. 도움말과 도움이되는 답변에 감사드립니다. – cwd

+0

echo \ c를 사용하는 이식성있는 방법은 형식 문자열에서'\ n'을 생략 할 경우'printf'를 사용하는 것입니다. 가장 자주 사용되는 bashism은 배열 변수, 테스트 용으로'[[...]]'와 같은 비 POSIX 구문, for ((...))가있는 루프,'select' 구조체 . – Jens

+0

내 macosx 사자에 배송 된 bash에서는 작동하지 않습니다 (GNU bash, 버전 3.2.48 (1) -release (x86_64-apple-darwin11)) – rjha94

4

문제는 $1

MYBASENAME="`basename $1`" 

에서 인용되지 않는 것입니다. 대신를 사용

MYBASENAME="$(basename "$1")" 
+2

$() 명령 대체 형식을 사용하는 경우 +1. 여러분이 정말로 Bourne shell 만 가지고있는 시스템을 사용하고 있다고 확신하지 않는다면 기술 구문을 1993 표준으로 업그레이드하지 않을까요? 나는 당신이 그것을 생각하지 않고'sed -i'를 사용할 것이라고 확신합니다. 그러나 bourne shell이나 100 개의 다른 GNU/Linux-isms에 의존하는 시스템에서는'sed -i'를 찾지 못할 것입니다. 모두에게 행운을 빕니다. shellter

0
MYBASENAME="`basename $1`" 

MYBASENAME="`basename "$1"`" 

감싸고 $1해야 당신이 인용 한 세트를 놓치고 따옴표 "$1"

2

와 함께!

MYBASENAME="`basename \"$1\"`" 

문제가 해결 될 것입니다.

+0

큰 따옴표와 백 슬래시를 너무 많이 쓰고 있습니다 :-) – Jens

관련 문제