2010-03-17 5 views
17

매일 밤 AppleScript에서 실행되는 bash 스크립트를 사용하여 매일 밤 새 폴더로 파일을 자동으로 이동하려고합니다. Mac OSX에서 bash 스크립트를 작성하려고하는데 실패하고 있습니다.bash 스크립트에서 변수를 설정할 수 없습니다.

#!/bin/bash 
folder = "ABC" 
useracct = 'test' 
day = date "+%d" 
month = date "+%B" 
year = date "+%Y" 
folderToBeMoved = "https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername = "/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; 
    then rm $folderToBeMoved; 
fi 

지금 내 첫 번째 문제는 내가 전혀 변수를 설정할 수 없다는 것입니다 : 즉 이것은 내가 무엇을 (내 모든 echo의 오류 검사를위한)입니다. 심지어 문자 그대로 문자 그대로 평범한 문자 그대로입니다. 내 echo 전체가 비어 있습니다. 나는 일, 달, 또는 년 중 하나를 움켜 잡을 수 없다, 그것은 또한 공백으로 나온다.

-f를 찾을 수 없다는 오류가 발생합니다.

예기치 않은 파일 끝에 오류가 있다는 메시지가 나타납니다.

나는 파일을 만든 것도 전혀 작동하지 않습니다 이유는 확실하지 해요 chmod u+x scriptname.sh

했다. 나는 OSX에서이 bash 스크립트를 처음 접했을 뿐이며 windows vbscript에 대한 경험이있다. 어떤 도움이라도 좋을 것입니다, 고마워요!

답변

40

할당은 = 주변의 공간을 가질 수 없습니다 당신은 아마 당신의 날짜 명령 역 따옴표$() 안에 원하는이 출력 나를 위해, 주석 마지막 세 라인

#!/bin/bash 
folder="ABC" 
useracct='test' 
day=$(date "+%d") 
month=$(date "+%B") 
year=$(date "+%Y") 
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername="/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; then rm $folderToBeMoved; fi 

:

Network is 
day is 16 
Month is March 
YEAR is 2010 
source is /users/test/Documents/Archive/Primetime.eyetv 
dest is /Volumes/Media/Network/ABC/March162010 
+2

백 틱이 악조 (중첩되지 않음)입니다. 나는 $()를 사용했다. 그러나 좋은 대답은 +1. – paxdiablo

+0

@paxdiablo 나는 천천히'$()'를 사용하는 법을 배우고 있지만, 15 세의 습관을 재 프로그래밍하는 것은 약간 어렵다. – Isaac

+0

@Isaac : 그만한 가치가 있습니다. 필자는 주기적으로'~/bin'과 backticks에 대한 yammers를 크롤링하는 lint 스크립트를 작성했습니다. 그 (것)들을 삭제하십시오! –

20

다섯 문제 :

  1. 이 등호 앞뒤에 공백을 두지 마십시오.
  2. "$(...)"을 사용하여 명령 출력을 텍스트로 가져옵니다.
  3. [은 명령입니다. 인수와 인수 사이에 공백을 넣으십시오.
  4. 명령은 대/소문자를 구분합니다. echo을 원합니다.
  5. 변수 주위에 큰 따옴표를 사용하십시오. bash는 스크립트 rm "$folderToBeMoved"
+1

+1, 꽤 많이 다루고 있습니다. 하지만 대부분의 OS X 시스템에서는 # 4가 정확하지 않습니다. 표준 설정은 대소 문자를 구별하지 않는 파일 시스템을 가지고 있기 때문에, ECHO는 잘 동작 할 것입니다. 나는 여전히 추천하지는 않지만,이 스크립트에 문제를 일으키지 않을 것이다. –

+0

Mac OS X의 기본 파일 시스템은 대소 문자를 구분하지 않습니다. 'ECHO'는'echo'와 마찬가지로 작동하지만, 이식성을 위해서는 현명한 생각이 아닙니다. – dreamlax

+1

충분하지만,'ECHO'는 실행 파일을 실행하고 bash는 내장되어 있지 않습니다. –

3

여기에 개정 된 스크립트

입니다개
#!/bin/bash  
folder="ABC" #no spaces between assignment  
useracct='test'  
day=$(date "+%d") # use $() to assign return value of date command to variable  
month=$(date "+%B")  
year=$(date "+%Y")  
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv"  
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"  
ECHO "Network is $network" $network  
ECHO "day is $day"  
ECHO "Month is $month"  
ECHO "YEAR is $year"  
ECHO "source is $folderToBeMoved"  
ECHO "dest is $newfoldername"  

mkdir "$newfoldername"  
cp -R "$folderToBeMoved" "$newfoldername" 
if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- put a space at square brackets and quote your variables. 
rm "$folderToBeMoved"; 
fi 
1

folder = "ABC" 시도는 인수 ="ABC"folder라는 명령을 실행합니다. bash는 명령의 형식은 다음과 같습니다

command arguments separated with space 

이 할당이 이루어집니다 동안 :

variable=something 

  • [ -f $newfoldername/Primetime.eyetv]에서 [ 명령입니다 (test) 및 -f$newfoldername/Primetime.eyetv]은 두 가지 인수. 은 찾을 수없는 세 번째 인수 (]) (인수는 여야하며 공백으로 구분되어야 함)가 필요하므로 오류가 표시됩니다.
  • [-f $newfoldername/Primetime.eyetv]
  • ,이 같은 경우에 $newfoldername/Primetime.eyetv]

일반적으로 인수를 명령 [-f을 실행 shellcheck에 코드를 붙여 피드백을 참조하려고합니다.

관련 문제