2010-03-17 36 views
17

Tôi đang cố tự động di chuyển các tệp từ thư mục sang thư mục mới mỗi đêm bằng cách sử dụng tập lệnh bash chạy từ AppleScript theo lịch biểu. Tôi đang cố gắng viết một kịch bản bash trên Mac OSX, và nó vẫn không thành công. Nói tóm lại đây là những gì tôi có (tất cả echo s của tôi là để kiểm tra lỗi):Không thể đặt biến trong tập lệnh 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 

Bây giờ vấn đề đầu tiên của tôi là tôi không thể thiết lập các biến ở tất cả. Ngay cả những người theo nghĩa đen, nơi tôi chỉ làm cho nó bằng một số chữ. Tất cả các echo của tôi đều trống. Tôi không thể lấy ngày, tháng, hay năm, nó cũng trống rỗng.

Tôi gặp lỗi khi nói rằng -f không được tìm thấy.

Tôi gặp lỗi khi nói có một kết thúc không mong muốn của tệp.

tôi đã thực hiện các tập tin và đã làm một chmod u+x scriptname.sh

Tôi không chắc chắn lý do tại sao không có gì được làm việc ở tất cả. Tôi rất mới với kịch bản bash này trên OSX, và chỉ có kinh nghiệm với các cửa sổ vbscript. Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn!

Trả lời

40

Chuyển nhượng trong kịch bản bash không thể có không gian xung quanh = và có thể bạn muốn lệnh ngày của bạn kèm theo trong backticks$():

#!/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 

Với ba dòng cuối cùng nhận xét ra, đối với tôi quả này :

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

Bù ve trở lại là điều xấu (không thể làm tổ). Tôi muốn sử dụng $() bản thân mình. Nhưng 1 cho một câu trả lời tốt. – paxdiablo

+0

@paxdiablo Tôi rất chậm khi học cách sử dụng '$()' bản thân mình, nhưng hơi khó để lập trình lại thói quen 15 tuổi. – Isaac

+0

@Isaac: nó rất đáng giá. Tôi đã viết một kịch bản lint mà định kỳ thu thập thông tin '~/bin' và những kẻ lừa đảo về backticks. Xóa chúng! –

20

Năm vấn đề:

  1. Đừng đặt một không gian trước hoặc sau dấu bằng.
  2. Sử dụng "$(...)" để nhận đầu ra của lệnh dưới dạng văn bản.
  3. [ là một lệnh. Đặt một khoảng trống giữa nó và các đối số.
  4. Lệnh có phân biệt chữ hoa chữ thường. Bạn muốn echo.
  5. Sử dụng dấu ngoặc kép xung quanh các biến. rm "$folderToBeMoved"
+1

+1, điều đó khá nhiều. # 4 là không chính xác cho hầu hết các hệ điều hành OS X mặc dù. Vì thiết lập chuẩn có hệ thống tập tin phân biệt dạng chữ, ECHO sẽ hoạt động tốt. Tôi vẫn sẽ không khuyên bạn nên nó, nhưng nó sẽ không gây ra một vấn đề với kịch bản này. –

+0

Hệ thống tệp mặc định trên Mac OS X phân biệt chữ hoa chữ thường. 'ECHO' hoạt động giống như' echo', mặc dù tính di động nó không phải là một ý tưởng khôn ngoan. – dreamlax

+1

Đủ công bằng, nhưng sau đó 'ECHO' thực thi tệp thực thi và không phải là bash được cài sẵn. –

3

đây là kịch bản đã sửa đổi của bạn

#!/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" cố gắng để chạy một lệnh tên folder với đối số ="ABC". Định dạng của lệnh trong bash là:

command arguments separated with space 

khi chuyển nhượng được thực hiện với:

variable=something 

  • Trong [ -f $newfoldername/Primetime.eyetv], [ là một lệnh (test) và -f$newfoldername/Primetime.eyetv] hai lập luận.Nó hy vọng một đối số thứ ba (]) mà nó không thể tìm thấy (đối số phải là được phân cách bằng dấu cách) và do đó sẽ hiển thị lỗi.
  • [-f $newfoldername/Primetime.eyetv] cố gắng để chạy một lệnh [-f với lập luận $newfoldername/Primetime.eyetv]

Nói chung đối với trường hợp như thế này, dán mã của bạn trong shellcheck và xem các phản hồi.

Các vấn đề liên quan