2011-10-04 4 views
0

폴더가 아래 스크립트에 있다고 가정하면 누군가가 왜 이것이 작동하지 않는지 말할 수 있습니까? 나는 테스트를 위해 여분의 공간을 벗어나지 만 어떻게 든 에러없이 그것을 좋아하지 않습니다 ...Bash 파일 시스템 디렉토리 테스트 속임수

#!/bin/bash 
Base='/tmp/' 
Sub='one space/another space/' 
declare -a ASub 
for argR in "${Sub[@]}" 
    do 
     Sub+=($(printf %q "$argR")) 
    done 
clear 
echo -n $Base 
if [ -d $ExBase ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
BaseAndSub=$Base$Sub 
echo -n $BaseAndSub 
if [ -d "$BaseAndSub" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
exit 0 
+1

이 스크립트로 무엇을 하시겠습니까? –

+0

'ASub'을 선언했지만 결코 사용하지 마십시오. $ {Sub [@]} "'에서'for'argR에'Sub' 배열을 정의/초기화하는 것은 명확하지 않습니다. 고전적으로는 최소한 BaseAndSub = "$ Base/$ Sub"를 사용해야합니다. 나는 그것을 100 % 필요하지는 않을지라도 (그렇지 않으면 절대적으로 명백하고 절대적이지 않다) 달리 쓰지는 않을 것이다. 이름에 인접한 공백이 여러 개 있으면'echo -n $ BaseAndSub'는'echo -n "$ BaseAndSub"가없는 곳의 경로를 잃어 버립니다. 좀 더 자유롭게 큰 따옴표를 사용하십시오. –

답변

0

@ 글렌이 말했듯이 여기에는 많은 잘못이 있습니다. ASub

근본적인 문제,하지만 당신은 많은 통해 거라고는 ... Sub 가끔, 가끔 배열로, ExBase 설정하지 않고 사용되는 문자열 변수로 사용, 사용 선언되지 않고, 불필요한 (때로는 파괴적인) 파일 이름의 공백을 처리하기위한 시도가 필요하다. 공백을 포함 할 수있는 모든 것에 대해 큰 따옴표를 사용하는 것이 필요하다. 배열은 파일 이름 (각각 공백이있을 수 있음) 또는 명령 문자열 (인수에 공백이있을 수 있음)의 목록을 저장하는 데 유용하지만이 경우에는 필요하지 않은 단일 파일 이름이 있습니다. 따옴표 (printf %q)를 추가하는 것은 거의 유용하지 않으며, 실제 따옴표/이스케이프/이름이있는 파일을 찾는 것입니다.

여기에 관련없는 내용물을 제거하고 두 자리 따옴표를 추가하여 작성했습니다. 또한 파일 이름에 슬래시를 포함하지 않는 표준 규칙으로 변경 했으므로 Base와 Sub를 함께 사용하면 "$Base/$Sub"이 아니라 "$Base$Sub"이됩니다. 나를 위해 잘 작동하는 것 같다 : bash는 스크립트 문제를 해결하려고 할 때

#!/bin/bash 
Base='/tmp' 
Sub='one space/another space' 
clear 
echo -n "$Base" 
if [ -d "$Base" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
BaseAndSub="$Base/$Sub" 
echo -n "$BaseAndSub" 
if [ -d "$BaseAndSub" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
exit 0 

이 BTW, 그것은 -x 옵션을 사용하는 것이 매우 도움 (중 set -x로, 또는 오두막 같은 #!/bin/bash -x를 사용). 이렇게하면 bash는 각 명령을 실행하기 전에 각 명령을 인쇄하여 매개 변수가 확장되어 정확히 무슨 일이 일어나는지 보여줍니다.

2

해당 스크립트에 많은 오류가 있습니다. ASub은 선언되어 사용되지 않습니다. ExBase은 결코 선언되지 않고 사용됩니다. ExBase 이후 if [ -d $ExBase ]
가 비어 및 설정 해제, 쉘이보고 :

나는이 주요 문제가 생각 나는 구문 오류를 예상했을하지만 분명히 쉘은 단지 비로서 "-d"보고
if [ -d ] 비어있는 문자열이므로 사실입니다.

+0

'set -o nounset;을 사용합니다. set -o errexit'를 사용하여 Bash가 자동으로 패스하는 대신에 Bash가 이런 오류를 막을 수있게합니다. –

관련 문제