Definisi variabel dalam bash menggunakan kata kunci lokal

33

Saya sedang belajar bash scripting dan menemukan ini di / usr / share / bash-completion saya, baris 305:

local cword words=()

Apa fungsinya? Semua tutorial online hanya dalam format

local var=value
Alexandre Santos
sumber

Jawaban:

92

Meskipun saya suka jawaban yang diberikan oleh jordanm, saya pikir itu sama pentingnya untuk menunjukkan kepada Linuxpengguna yang kurang berpengalaman bagaimana mengatasi pertanyaan seperti itu sendiri.

Cara yang disarankan lebih cepat dan lebih fleksibel daripada mencari jawaban di halaman acak yang muncul di halaman hasil pencarian Google.

Pertama, semua perintah yang dapat dijalankan Bashtanpa mengetikkan jalur eksplisit untuk itu seperti ./commanddapat dibagi menjadi dua kategori: Bash shell builtinsdan external commands. Bash shell builtinsdatang terinstal dengan Bashdan merupakan bagian dari itu sementara external commandsbukan bagian dari Bash. Ini penting karena Bash shell builtinsdidokumentasikan di dalam man bashdan dokumentasinya dapat juga dipanggil dengan helpperintah sementara external commandsbiasanya didokumentasikan sendiri manpagesatau mengambil beberapa raja -h, --helpbendera. Untuk memeriksa apakah perintah adalah Bash shell builtinatau external command:

$ type local
local is a shell builtin

Ini akan menampilkan how command would be interpreted if used as a command name(dari help type). Di sini kita dapat melihat bahwa itu localadalah a shell builtin. Mari kita lihat contoh lain:

$ type vim
vim is /usr/bin/vim

Di sini kita dapat melihat bahwa vimitu bukan shell builtinperintah eksternal yang terletak di /usr/bin/vim. Namun, kadang-kadang perintah yang sama dapat diinstal baik sebagai external commanddan shell builtinsekaligus. Tambahkan -ake typeke daftar semua kemungkinan, misalnya:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Di sini kita dapat melihat bahwa echokeduanya adalah a shell builtindan an external command. Namun, jika Anda baru saja mengetik echodan menekan Returna shell builtinakan dipanggil karena muncul pertama pada daftar ini. Perhatikan bahwa semua versi ini echotidak harus sama. Sebagai contoh, pada sistem saya /usr/bin/echomengambil --helpflag sedangkan yang builtintidak.

Ok, sekarang ketika kita tahu itu localadalah shell builtin mari kita cari tahu cara kerjanya:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Perhatikan baris pertama: name[=value]. Semuanya antara [dan ]adalah opsional . Ini adalah konvensi umum yang digunakan dalam banyak manpagesdan bentuk dokumentasi di *nixdunia. Yang sedang berkata, perintah yang Anda tanyakan dalam pertanyaan Anda sepenuhnya sah. Pada gilirannya, ...karakter berarti bahwa argumen sebelumnya dapat diulang. Anda juga dapat membaca tentang konvensi ini di beberapa versi man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Jadi, pada akhirnya, saya harap sekarang Anda akan memiliki waktu yang lebih mudah untuk memahami bagaimana berbagai perintah Linuxbekerja.

Arkadiusz Drabczyk
sumber
5
Jawaban yang sangat bagus Saya membacanya berharap Anda akan membahas bagaimana seorang pemula dapat menemukan sendiri apa tugas array itu, hanya dari kode var=(), tapi saya kira itu agak sulit untuk dipikirkan tanpa mengetahui nama apa yang Anda cari . ;)
Wildcard
Apakah cangkang non-bash juga mendukung local?
palswim
2
Saya masuk hanya supaya saya dapat menjawab jawaban Anda dengan suara :)
Harendra Singh
@ Kartu Memori Karena arraynya adalah sintaks bash yang bertentangan dengan perintah, Anda dapat menemukannya dalam definisi man bash. Setelah di sana, ketik /Arrays$untuk melompat ke bagian array. (Trailing The $setelah Arraysini untuk mencegah bersepeda melalui referensi dalam teks ke bagian.) Dari sana Anda dapat mengetik funtuk maju halaman atau bpergi ke belakang. Ketik quntuk keluar dari halaman manual setelah selesai.
Taylor Edmiston
Juga, menjalankan helptanpa argumen akan mencantumkan semua bash bawaan jika Anda penasaran ingin melihat lebih banyak.
Taylor Edmiston
29

Kata localkunci dapat mengambil banyak variabel. Menyediakan variabel dengan nilai adalah opsional. Contoh Anda mendeklarasikan dua variabel, cworddan words. The wordsvariabel ditugaskan array kosong.

jordanm
sumber
18

localcukup mendeklarasikan variabel hanya memiliki ruang lingkup dalam fungsi yang saat ini ditentukan, sehingga lingkungan pelaksana utama tidak dapat "melihat" nilainya. Anda tidak dapat menggunakan di localluar fungsi. Contoh

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Output: Variabel non lokal

Jadi $onlyheretidak terlihat di luar ruang lingkup fungsi.

Otheus
sumber
Jawaban ini lebih masuk akal yang membutuhkan pemahaman cepat.
Alex Raj Kaliamoorthy