2009-03-23 28 views
129

Tôi chạy trên nhiều tập lệnh shell có các biến trong tất cả các chữ cái và tôi luôn nghĩ rằng có một sự hiểu lầm nghiêm trọng với điều đó. Sự hiểu biết của tôi là, theo quy ước (và có lẽ bởi sự cần thiết từ lâu), biến môi trường là trong tất cả các mũ.Sửa đúng cách viết hoa chữ viết của Bash và shell

Nhưng trong môi trường kịch bản hiện đại như Bash, tôi luôn ưu tiên quy ước tên thường dùng cho các biến tạm thời và các trường hợp viết hoa chỉ cho các biến được xuất (ví dụ: môi trường). Ví dụ:

#!/usr/bin/env bash 
year=`date +%Y` 
echo "It is $year." 
export JAVA_HOME="$HOME/java" 

Điều đó luôn là việc tôi thực hiện. Có bất kỳ nguồn có thẩm quyền nào đồng ý hoặc không đồng ý với cách tiếp cận này, hay nó hoàn toàn là vấn đề về phong cách?

Trả lời

177

Theo quy ước, các biến môi trường (PAGER, EDITOR, ..) và các biến shell nội (SHELL, BASH_VERSION, ..) đều được viết hoa. Tất cả các tên biến khác phải là chữ thường.

Hãy nhớ rằng các tên biến phân biệt chữ hoa chữ thường; quy ước này tránh vô tình ghi đè các biến môi trường và nội bộ.

Theo quy ước này, bạn có thể yên tâm rằng bạn không cần phải biết mọi biến môi trường được sử dụng bởi các công cụ UNIX hoặc vỏ để tránh ghi đè chúng. Nếu đó là biến của bạn, hãy viết chữ thường. Nếu bạn xuất nó, viết hoa nó.

+5

+1. Điểm tốt về việc ghi đè tình cờ.Tôi quên đề cập đến, nhưng bây giờ bạn đề cập đến nó, tôi nghĩ rằng tôi quyết định sử dụng chữ thường vì tôi đọc hoặc nghe nói về vấn đề đó. – JasonSmith

+3

Tôi nghĩ lý do chính để sử dụng tên biến hoa là để tránh xung đột với lệnh shell. Gần đây chúng tôi đã có tên máy chủ của một trong các máy chủ của chúng tôi vô tình thay đổi thành '=' bởi vì tập lệnh được sử dụng biến 'tên máy chủ'. – ThisSuitIsBlackNot

+17

@ ThisSuitIsBlackNot Bỏ qua mã crappy, các biến được bắt đầu bằng một đồng đô la khi được mở rộng và được sử dụng ở một nơi mà chúng không thể bị nhầm lẫn với tên lệnh khi chúng không. Rõ ràng, làm hostname = moo là sẽ đất bạn gặp rắc rối. Không phải vì bạn đang sử dụng "tên máy chủ" thấp hơn, nhưng vì bạn không sử dụng đúng cú pháp gán. Nhiệm vụ được thực hiện với hostname = moo, không có dấu cách. Giả sử mã đúng, bạn không cần phải lo lắng về các tên biến xung đột với tên lệnh. – lhunath

3

Nó chỉ là một quy ước được tổ chức rất rộng rãi, tôi nghi ngờ có bất kỳ nguồn "có thẩm quyền" nào cho nó.

5

Tôi làm những gì bạn làm. Tôi nghi ngờ có một nguồn có thẩm quyền, nhưng có vẻ như một tiêu chuẩn thực tế khá phổ biến.

+0

Tôi đồng ý. Đó là bởi vì ALL_CAPS là xấu xí, nhưng nó là tốt để làm cho VARIABLES MÔI TRƯỜNG nổi bật bằng cách xấu xí. – slim

+0

Tôi đồng ý với bạn về phong cách mã hóa, nhưng tôi chắc chắn không đồng ý rằng nó được phổ biến rộng rãi! Shell script là một trong những ngôn ngữ phụ mà mọi người chỉ học không chính thức, và vì vậy tôi cảm thấy như mọi người luôn nói LOCATION = 'cat/tmp/location.txt' – JasonSmith

+0

@jhs - Tôi rõ ràng là may mắn trong các kịch bản shell tôi ' đã phải làm việc với! – Draemon

2

tôi có xu hướng sử dụng ALL_CAPS cho cả biến môi trường và toàn cầu. tất nhiên, trong Bash không có phạm vi biến thực, vì vậy có một phần tốt của các biến được sử dụng như globals (chủ yếu là cài đặt và theo dõi trạng thái) và tương đối ít 'người dân địa phương' (quầy, vòng lặp, chuỗi được xây dựng một phần và thời gian)

+0

Vâng, tôi nghĩ về các biến không được xuất khẩu một cách khái niệm như người dân địa phương, vì Bash thường xuyên cấm các tiến trình con làm bất cứ điều gì nó có nhiệm vụ làm. – JasonSmith

3

Thực tế, thuật ngữ "biến môi trường" có vẻ là tiền xu khá gần đây. Kernighan và Pike trong cuốn sách kinh điển của họ "Môi trường lập trình UNIX", xuất bản năm 1984, chỉ nói về "biến shell" - thậm chí không có mục nhập cho "môi trường" trong chỉ mục!

+4

Tôi nghĩ đó là một sự thiếu sót của cuốn sách. getenv(), setenv() và môi trường được giới thiệu trong UNIX phiên bản 7 (1979). http://en.wikipedia.org/wiki/Version_7_Unix – Juliano

+2

Cuốn sách đó cần lưu ý rằng các biến hoa trên có ý nghĩa đặc biệt. – ashawley

3

Bất kỳ quy ước đặt tên nào được tuân thủ một cách nhất quán sẽ luôn hữu ích. Dưới đây là một vài lời khuyên hữu ích cho vỏ biến đặt tên:

  • Sử dụng tất cả mũ và nhấn cho các biến xuất khẩu và hằng số. Sử dụng một tiền tố chung bất cứ khi nào có thể áp dụng để các biến liên quan nổi bật.

    Ví dụ:

    • biến xuất khẩu với một tiền tố chung: JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • Constants: PIMAX_FILESOKERRORWARNING
  • Sử dụng "rắn trường hợp" (tất cả chữ thường và gạch dưới) cho tất cả các biến được phạm vi cho một tập lệnh hoặc một khối.

    Ví dụ: input_filefirst_valuemax_amountnum_errors

    trường hợp hỗn hợp khi biến cục bộ có một số mối quan hệ với một biến môi trường, như: old_IFSold_HOME

  • Sử dụng một hàng đầu gạch cho các biến "private" và chức năng. Điều này đặc biệt có liên quan nếu bạn đã từng viết một thư viện shell nơi các hàm trong một tệp thư viện hoặc trên các tệp cần chia sẻ các biến, mà không bao giờ đụng độ với bất kỳ thứ gì có thể được đặt tên tương tự trong mã chính.

    Ví dụ: _debug_debug_level_current_log_file

  • bao giờ sử dụng trường hợp lạc đà. Điều này sẽ đảm bảo chúng tôi không gặp lỗi do lỗi chính tả. Hãy nhớ rằng, các biến shell phân biệt chữ hoa chữ thường.

    Ví dụ: inputArraythisLooksBAD, numRecordsProcessed, veryInconsistent_style


Xem thêm:

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