Kapitalisasi variabel skrip Bash dan shell yang benar

193

Saya menjalankan banyak skrip shell dengan variabel dalam semua huruf besar, dan saya selalu berpikir bahwa ada kesalahpahaman yang parah dengan itu. Pemahaman saya adalah bahwa, dengan konvensi (dan mungkin karena kebutuhan lama), variabel lingkungan berada di semua batas.

Tetapi dalam lingkungan skrip modern seperti Bash, saya selalu lebih suka konvensi nama huruf kecil untuk variabel sementara, dan huruf besar hanya untuk variabel yang diekspor (yaitu lingkungan) . Sebagai contoh:

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

Itu selalu menjadi pandangan saya tentang berbagai hal. Apakah ada sumber otoritatif yang setuju atau tidak setuju dengan pendekatan ini, atau apakah itu murni masalah gaya?

JasonSmith
sumber

Jawaban:

262

Dengan konvensi, variabel lingkungan ( PAGER, EDITOR, ...) dan variabel shell internal yang ( SHELL, BASH_VERSION, ...) dikapitalisasi. Semua nama variabel lainnya harus huruf kecil.

Ingat bahwa nama variabel peka huruf besar-kecil; konvensi ini menghindari variabel lingkungan dan internal yang secara tidak sengaja diabaikan.

Mengikuti konvensi ini, Anda dapat yakin bahwa Anda tidak perlu tahu setiap variabel lingkungan yang digunakan oleh alat atau shell UNIX untuk menghindari menimpa mereka. Jika itu variabel Anda, kecilkan. Jika Anda mengekspornya, huruf besar.

lununath
sumber
8
+1. Poin bagus tentang penulisan ulang yang tidak disengaja. Saya lupa menyebutkan, tetapi sekarang setelah Anda menyebutkannya, saya pikir saya memutuskan untuk menggunakan huruf kecil karena saya membaca atau mendengar tentang masalah itu.
JasonSmith
5
Saya pikir alasan utama untuk menggunakan nama variabel huruf besar adalah untuk menghindari konflik dengan perintah shell. Kami baru-baru ini memiliki nama host dari salah satu server kami tanpa sengaja berubah menjadi '=' karena skrip menggunakan variabel 'nama host'.
ThisSuitIsBlackNot
25
@ThisSuitIsBlackNot Mengabaikan kode jelek, variabel diawali dengan dolar ketika diperluas dan digunakan di tempat di mana mereka tidak dapat bingung dengan nama perintah ketika mereka tidak. Jelas, melakukan hostname = moo akan membuat Anda dalam masalah. Bukan karena Anda menggunakan "nama host" yang lebih kecil, tetapi karena Anda tidak menggunakan sintaks penugasan yang benar. Tugas dilakukan dengan hostname = moo, tanpa spasi. Dengan asumsi kode yang benar, Anda tidak perlu khawatir tentang nama variabel yang bertentangan dengan nama perintah.
lhunath
3
Semua buku teks yang saya lihat selalu menggunakan huruf besar untuk semua variabel shell. Sementara nama variabel huruf kecil diizinkan, huruf besar adalah konvensi.
Brian S. Wilson
3
Saya tidak tahu ini, dan saya baru saja kehilangan beberapa jam. lebih dari menggunakan USER="username"dalam skrip bash mengotomatisasi beberapa perintah jarak jauh melalui ssh bukan user="username". Ugh! Senang saya tahu sekarang!
Gabriel Staples
28

Setiap konvensi penamaan yang diikuti secara konsisten akan selalu membantu. Berikut adalah beberapa tips bermanfaat untuk penamaan variabel shell:

  • Gunakan semua batas dan garis bawah untuk variabel dan konstanta yang diekspor, terutama ketika mereka dibagi di beberapa skrip atau proses. Gunakan awalan umum kapan pun berlaku sehingga variabel terkait menonjol dan tidak akan berbenturan dengan variabel internal Bash yang semuanya huruf besar.

    Contoh:

    • Variabel yang diekspor dengan awalan umum: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • Konstanta: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • Gunakan "case ular" ( semua huruf kecil dan garis bawah ) untuk semua variabel yang dicakup dalam satu skrip atau blok.

    Contoh: input_file first_value max_amount num_errors

    Gunakan case campuran ketika variabel lokal memiliki beberapa hubungan dengan variabel lingkungan, seperti: old_IFS old_HOME

  • Gunakan garis bawah utama untuk variabel dan fungsi "pribadi". Ini sangat relevan jika Anda pernah menulis pustaka shell di mana fungsi-fungsi di dalam file pustaka atau di seluruh file perlu berbagi variabel, tanpa pernah berbenturan dengan apa pun yang mungkin sama bernama dalam kode utama.

    Contoh: _debug _debug_level _current_log_file

  • Hindari kasing unta . Ini akan meminimalkan bug yang disebabkan oleh kesalahan ketik. Ingat, variabel shell peka huruf besar-kecil .

    Contoh: inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


Lihat juga:

codeforester
sumber
1
Ini adalah sebuah konvensi tetapi diterima hampir secara universal. Alasan terhadap kasus unta tidak sepenuhnya meyakinkan. Rekomendasi untuk menggunakan SHOUTING untuk variabel yang diekspor agak kontroversial.
tripleee
3
Saya tidak membuat klaim bahwa itu adalah konvensi yang biasa diikuti. Saya telah melihat bahwa sebagian besar programmer tidak berpikir serius tentang mengikuti konvensi yang kuat dalam skrip shell dan berpikir untuk mencatat pemikiran saya berdasarkan apa yang telah saya lakukan.
codeforester
8

Jika variabel shell akan diekspor ke lingkungan, ada baiknya mempertimbangkan bahwa POSIX (Edisi 7, edisi 2018) Definisi Variabel Lingkungan menentukan:

Nama variabel lingkungan yang digunakan oleh utilitas dalam volume Shell dan Utilities dari POSIX.1-2017 hanya terdiri dari huruf besar, digit, dan garis bawah ( _) dari karakter yang didefinisikan dalam Portable Character Set dan tidak dimulai dengan angka.

...

Ruang nama nama variabel lingkungan yang berisi huruf kecil dicadangkan untuk aplikasi. Aplikasi dapat mendefinisikan variabel lingkungan apa pun dengan nama dari ruang nama ini tanpa mengubah perilaku utilitas standar.

Anthony Geoghegan
sumber
6

Saya melakukan apa yang Anda lakukan. Saya ragu ada sumber yang berwenang, tetapi tampaknya standar de-facto cukup luas.

Draemon
sumber
1
Saya setuju. Itu karena ALL_CAPS jelek, tapi bagus untuk membuat VARIABEL LINGKUNGAN menonjol dengan menjadi jelek.
ramping
1
Saya setuju dengan Anda tentang gaya pengkodean, tapi saya jelas tidak setuju bahwa itu menyebar luas! Script Shell adalah salah satu bahasa sampingan yang dipelajari oleh orang-orang secara informal, jadi saya merasa semua orang selalu mengatakan LOCATION =cat /tmp/location.txt
JasonSmith
@ jhs - Saya jelas beruntung dalam skrip shell yang harus saya tangani!
Draemon
4
"Ruang nama nama variabel lingkungan yang mengandung huruf kecil dicadangkan untuk aplikasi." - POSIX IEEE Std 1003.1-2008 bagian 8.1
tripleee
5

Sebenarnya, istilah "variabel lingkungan" tampaknya merupakan mata uang yang cukup baru. Kernighan dan Pike dalam buku klasik mereka "Lingkungan Pemrograman UNIX", yang diterbitkan pada tahun 1984, hanya berbicara tentang "variabel shell" - bahkan tidak ada entri untuk "lingkungan" dalam indeks!


sumber
8
Saya pikir itu adalah penghilangan buku. getenv (), setenv () dan environment diperkenalkan dalam UNIX versi 7 (1979). en.wikipedia.org/wiki/Version_7_Unix
Juliano
3
Buku itu terlihat mencatat bahwa variabel huruf besar memang memiliki arti khusus.
ashawley
3

Itu hanya konvensi yang diadakan secara luas, saya ragu ada sumber "otoritatif" untuk itu.

Alnitak
sumber
1

saya cenderung menggunakan ALL_CAPS baik untuk variabel lingkungan dan global. tentu saja, di Bash tidak ada ruang lingkup variabel nyata, jadi ada bagian yang baik dari variabel yang digunakan sebagai global (sebagian besar pengaturan dan pelacakan negara), dan relatif sedikit 'penduduk lokal' (penghitung, iterator, string sebagian dibangun, dan sementara)

Javier
sumber
Ya, saya secara konseptual menganggap variabel yang tidak diekspor sebagai penduduk lokal, karena Bash sering memalsukan proses anak untuk melakukan apa pun yang diperintahkan.
JasonSmith