Đúng Bash và viết hoa biến shell shell


191

Tôi chạy trên nhiều tập lệnh shell với các biến trong tất cả các mũ 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), các biến môi trường nằm trong tất cả các mũ.

Nhưng trong các môi trường tập lệnh hiện đại như Bash, tôi luôn ưu tiên quy ước tên viết thường cho các biến tạm thời và các chữ in hoa chỉ dành cho các biến xuất (tức là 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 luôn là của tôi về mọi thứ. Có bất kỳ nguồn có thẩm quyền nào đồng ý hoặc không đồng ý với phương pháp này, hay đó hoàn toàn là vấn đề về phong cách?

Câu trả lời:


262

Theo quy ước, các biến môi trường ( PAGER, EDITOR, ...) và các biến vỏ bên trong ( SHELL, BASH_VERSION, ...) là hoa. Tất cả các tên biến khác nên viết thường.

Hãy nhớ rằng tên biến là trường hợp nhạy cảm; 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 shell để tránh ghi đè lên chúng. Nếu đó là biến của bạn, hãy viết thường nó. Nếu bạn xuất nó, viết hoa nó.


8
+1. Điểm tốt về ghi đè tình cờ. Tôi đã quên đề cập đến, nhưng bây giờ khi 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 về vấn đề đó.
JasonSmith

5
Tôi nghĩ lý do chính để sử dụng tên biến chữ hoa là để tránh xung đột với các 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 '=' vì tập lệnh đã sử dụng biến 'tên máy chủ'.
ThisSuitIsBlackNot

25
@ ThisSuitIsBlackNot Bỏ qua mã crappy, các biến được tiền tố bằng một đô 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 một tên lệnh khi chúng không. Rõ ràng, làm hostname = moo sẽ khiến bạn gặp rắc rối. Không phải vì bạn đang sử dụng "tên máy chủ" cấp thấp, mà bởi vì bạn không sử dụng cú pháp gán chính xác. Việc chuyển nhượng được thực hiện với hostname = moo, không có khoảng trắng. Giả sử mã chính xác, 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
Tất cả các sách văn bản tôi đã xem luôn chữ hoa của người dùng cho tất cả các biến shell. Trong khi tên biến chữ thường được cho phép, chữ hoa là quy ước.
Brian S. Wilson

3
Tôi không biết điều này và tôi chỉ mất vài giờ. thay vì sử dụng USER="username"trong tập lệnh bash tự động hóa một số lệnh từ xa qua ssh thay vì user="username". Ừ! Vui mừng tôi biết bây giờ!
Gabriel Staples

28

Bất kỳ quy ước đặt tên theo sau nhất quán sẽ luôn luôn giúp đỡ. Dưới đây là một vài lời khuyên hữu ích cho việc đặt tên biến shell:

  • Sử dụng tất cả các giới hạn và dấu gạch dưới cho các biến và hằng được xuất, đặc biệt khi chúng được chia sẻ trên nhiều tập lệnh hoặc quy trình. Sử dụng 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à không xung đột với các biến nội bộ Bash , tất cả đều là chữ hoa.

    Ví dụ:

    • Các biến được xuất với tiền tố phổ biến: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • Hằng số: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • Sử dụng "trường hợp con rắn" ( tất cả chữ thường và dấu gạch dưới ) cho tất cả các biến được đặt trong một tập lệnh hoặc một khối.

    Ví dụ: input_file first_value max_amount num_errors

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

  • Sử dụng một dấu gạch dưới hàng đầu cho các biến và hàm "riêng tư". Điều này đặc biệt có liên quan nếu bạn từng viết thư viện shell trong đó các hàm trong 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ờ xung đột 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

  • Tránh trường hợp lạc đà . Điều này sẽ giảm thiểu các lỗi gây ra bởi lỗi chính tả. Hãy nhớ rằng, các biến shell là trường hợp nhạy cảm .

    Ví dụ: inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


Xem thêm:


1
Đây là một quy ước nhưng nó hầu như không được chấp nhận. Lý do chống lại trường hợp lạc đà không hoàn toàn thuyết phục. Khuyến nghị sử dụng CHIA SẺ cho các biến xuất khẩu đang gây tranh cãi nhẹ.
tripleee

3
Tôi đã không đưa ra một tuyên bố rằng đó là một quy ước thường được tuân theo. Tôi đã thấy rằng hầu hết các lập trình viên không suy nghĩ nghiêm túc về việc tuân theo các quy ước mạnh mẽ trong các kịch bản shell và nghĩ đến việc ghi lại những suy nghĩ của tôi dựa trên những gì tôi đã làm.
codeforester

8

Nếu các biến shell sẽ được xuất ra môi trường, thì đáng để xem xét rằng POSIX (Số phát hành 7, phiên bản 2018) Định nghĩa biến môi trường xác định:

Tên biến môi trường được sử dụng bởi các tiện ích trong khối Shell và Tiện ích của POSIX.1-2017 chỉ bao gồm các chữ cái in hoa, chữ số và dấu gạch dưới ( _) từ các ký tự được xác định trong Bộ ký tự di động và không bắt đầu bằng một chữ số.

...

Không gian tên của các tên biến môi trường chứa các chữ cái viết thường được dành riêng cho các ứng dụng. Các ứng dụng có thể định nghĩa bất kỳ biến môi trường nào có tên từ không gian tên này mà không sửa đổi hành vi của các tiện ích tiêu chuẩn.


6

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.


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

1
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ó phổ biến! Các kịch bản Shell 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 VỊ TRÍ =cat /tmp/location.txt
JasonSmith

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

4
"Không gian tên của các tên biến môi trường chứa các chữ cái viết thường được dành riêng cho các ứng dụng." - POSIX IEEE Std 1003.1-2008 phần 8.1
tripleee 19/12/17

5

Trên thực tế, thuật ngữ "biến môi trường" dường như là một loại tiền khá gần đây. Kernighan và Pike trong cuốn sách kinh điển "Môi trường lập trình UNIX", xuất bản năm 1984, chỉ nói về "biến vỏ" - thậm chí không có mục nào cho "môi trường" trong chỉ mục!


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

3
Cuốn sách này có vẻ lưu ý rằng các biến chữ hoa thường có ý nghĩa đặc biệt.
ashawley

3

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


1

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


Đúng, tôi nghĩ về các biến không xuất khẩu theo khái niệm địa phương, vì Bash thường xuyên buộc các tiến trình con làm bất cứ việc gì nó được giao.
JasonSmith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.