2011-08-23 27 views
6

Tôi sử dụng ZSH cho trình bao terminal của mình, và trong khi tôi đã viết một số hàm để tự động hóa các tác vụ cụ thể, tôi chưa bao giờ thực sự thử bất cứ thứ gì yêu cầu chức năng tôi đang làm.ZSH/Shell biến/sử dụng biến

Gần đây tôi đã viết lại một blog bằng Jekyll và tôi muốn tự động hóa việc sản xuất các bài đăng trên blog và cuối cùng là tải lên các tệp mới được tạo lên máy chủ của tôi bằng cách sử dụng một cái gì đó như scp.

Tôi hơi bối rối về các ràng buộc/sử dụng biến trong ZSH; ví dụ:

DATE= date +'20%y-%m-%d' 
echo $DATE 

kết quả đầu ra chính xác 2011-08-23 như tôi mong đợi.

Nhưng khi tôi thử:

DATE= date +'20%y-%m-%d' 
FILE= "~/path/to/_posts/$DATE-$1.markdown" 
echo $FILE 

Nó ra:

2011-08-23 
blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory 

Và khi chạy với những gì tôi muốn được muốn tiêu đề blog để được (bất chấp sự thật chuỗi cần phải được được điều chỉnh để làm cho url thân thiện hơn và đường dẫn/đường dẫn không tồn tại)

tức là blog "tiêu đề blog", kết quả đầu ra:

2011-08-23 
blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory 

Tại sao in $ DATE phía trên lệnh gọi để in $ FILE thay vì chuỗi được đưa vào $ FILE?

+0

'date +% Y-% m-% d' là sạch hơn 'date + 20% y-% m-% d'. 'date +% F' thậm chí còn sạch hơn. (Điều này giả sử lệnh 'date' của bạn hỗ trợ các định dạng này; ngày GNU thực hiện, nhưng những người khác có thể không.) –

Trả lời

16

Hai sự cố xảy ra ở đây.

Thứ nhất, đoạn mã đầu tiên của bạn không làm những gì tôi nghĩ bạn nghĩ. Thử xóa dòng thứ hai, echo. Nó vẫn in ngày, phải không? Bởi vì đây:

DATE= date +'20%y-%m-%d' 

Không phải là một nhiệm vụ biến - đó là một lời khẩn cầu date với một biến môi trường phụ trợ (cú pháp chung là VAR_NAME=VAR_VALUE COMMAND). Ý bạn là:

DATE=$(date +'20%y-%m-%d') 

Đoạn thứ hai của bạn sẽ vẫn không thành công, nhưng khác nhau. Một lần nữa, bạn đang sử dụng cú pháp gọi-với-môi trường thay vì gán. Ý của bạn là:

# note the lack of a space after the equals sign 
FILE="~/path/to/_posts/$DATE-$1.markdown" 

Tôi nghĩ rằng điều đó nên thực hiện thủ thuật.

Tuyên bố từ chối trách nhiệm: trong khi tôi biết bash rất tốt, tôi chỉ mới bắt đầu sử dụng zsh gần đây; có thể có zshisms tại nơi làm việc ở đây mà tôi không biết.

+0

Được đánh giá cao, hoạt động chính xác như tôi muốn. Bạn đã tìm hiểu về bash ở đâu, đặc biệt là những thứ như gọi với môi trường và tương tự? Tôi có khả năng gặp phải nhiều vấn đề hơn và có nơi nào đó để tham khảo sẽ giúp ích rất nhiều. – HaaR

+0

Kid, tôi đã học kịch bản shell của tôi trên đường phố. Nghiêm túc. Ẩn dụ, nhưng nghiêm túc. Tôi đã sử dụng một dòng lệnh unix trên cơ sở hàng ngày kể từ năm 1998, với một chút thỉnh thoảng của kịch bản, và tôi đã làm kịch bản nghiêm túc như một phần công việc của tôi trong một vài năm. Tôi làm việc với những người khác biết viết kịch bản và học hỏi từ họ. Tôi đặt câu hỏi trên các nhóm tin. Tôi đọc kịch bản trong các gói tôi sử dụng. Tôi đọc tài liệu tốt khi tôi tìm thấy nó - mà cho kịch bản shell, là buồn bã không thường xuyên. –

+3

Ba tài liệu thực sự đáng đọc là bản vá lỗi nhưng không thể thiếu [Advanced Bash-Scripting Guide] (http://tldp.org/LDP/abs/html/), [Hướng dẫn tham khảo Bash] dễ chịu nhưng khá khó chịu (http: //www.gnu.org/software/bash/manual/bashref.html), và, tất nhiên, 'man bash'. Bạn cũng nên đọc lời khuyên tuyệt vời của [Richard Kettlewell] (http://www.greenend.org.uk/rjk/2001/04/shell.html) và [David Pashley] (http://www.davidpashley.com) /articles/writing-robust-shell-scripts.html). –

7

Tìm hiểu về những gì vỏ gọi là 'mở rộng'.Có rất nhiều loại, thực hiện theo một thứ tự cụ thể:

Trình tự mở rộng từ như sau:

  1. mở rộng dấu ngã
  2. mở rộng tham số
  3. thay thế lệnh
  4. mở rộng số học
  5. tên đường dẫn mở rộng, trừ khi set -f có hiệu lực
  6. quote loại bỏ, luôn luôn thực hiện cuối cùng

Lưu ý rằng việc mở rộng dấu ngã chỉ được thực hiện khi các dấu ngã không được trích dẫn; viz .:

$ FILE="~/.zshrc" 
$ echo $FILE 
~/.zshrc 
$ FILE=~./zshrc 
$ echo $FILE 
/home/user42/.zshrc 

Và không được có khoảng trắng xung quanh = trong các bài tập thay đổi.

Vì bạn hỏi trong một chú thích nơi để tìm hiểu lập trình shell, có một số lựa chọn:

  • đọc của vỏ thủ công trang man zsh
  • Đọc đặc điểm kỹ thuật của vỏ POSIX, http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html, đặc biệt là nếu bạn muốn để chạy tập lệnh của bạn trên các hệ điều hành khác nhau (và bạn sẽ tìm thấy chính mình trong tình huống đó một ngày tốt đẹp!)
  • Đọc sách về lập trình vỏ.
  • Hằng ra trong comp.unix.shell usenet newsgroup nơi rất nhiều phù thủy vỏ đáp các thắc mắc