Yerel anahtar kelimeyi kullanarak bash içindeki değişken tanımı


33

Bash betiğini öğreniyorum ve bunu / usr / share / bash-bitiminde, 305 satırında buldum:

local cword words=()

Bu ne işe yarıyor? Tüm öğreticiler çevrimiçi formatta

local var=value

Yanıtlar:


92

Jordanm tarafından verilen cevabı sevmeme rağmen, daha az deneyimli Linuxkullanıcılara bu tür sorularla nasıl başa çıkacaklarını göstermek de eşit derecede önemli .

Önerilen yöntem, Google arama sonuçları sayfasında görüntülenen rasgele sayfalardaki yanıtları aramaktan daha hızlı ve çok yönlüdür.

Öncelikle, Bashaçık bir yol yazmadan çalıştırılabilen tüm komutlar, ./commandiki kategoriye ayrılabilir: Bash shell builtinsve external commands. Bash shell builtinsile yüklenen gelip Bashve süre onun bir parçası olan external commandsbir parçası değildir Bash. Bu önemlidir, çünkü Bash shell builtinsiçeride belgelenir man bashve genellikle kendi başlarına belgelendirilirken veya bir miktar bayrak kralı helpalırken external commandsbelgeleri de komutla çağrılabilir . Bir komutun a veya an olup olmadığını kontrol etmek için :manpages-h, --helpBash shell builtinexternal command

$ type local
local is a shell builtin

how command would be interpreted if used as a command name(Dan help type) gösterecektir . Burada görebilirsiniz localbir olduğunu shell builtin. Başka bir örnek görelim:

$ type vim
vim is /usr/bin/vim

Burada bunun içinde bulunan harici bir komut vimolmadığını görebiliriz . Ancak, bazen aynı komut bir şekilde hem yüklenmeden ve olmak aynı zamanda. Tüm olasılıkları listelemek için ekleyin , örneğin:shell builtin/usr/bin/vimexternal commandshell builtin-atype

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

Burada bunun echohem a hem de shell builtinan olduğunu görebiliriz external command. Sadece yazmış Ancak, echove preslenmiş Returnbir shell builtinbu listede ilk göründüğü için adlandırılırdı. Tüm bu sürümlerin echoaynı olması gerekmediğine dikkat edin. Örneğin, benim sistemde /usr/bin/echoalır --helpbir süre bayrağı builtinyok.

Tamam, şimdi localbunun bir kabuk yerleşik olduğunu bildiğimizde, nasıl çalıştığını bulalım:

$ 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.

İlk satırı Not: name[=value]. Arasındaki her şey [ve ]bir isteğe bağlı . Dünyada birçok manpagesve genel dokümantasyonda kullanılan yaygın bir kongredir *nix. Olduğu söyleniyor, sorunuzda sorduğunuz komut tamamen yasal. Sırayla, ...karakter önceki argümanın tekrarlanabileceği anlamına gelir. Bu kongre hakkında ayrıca bazı versiyonlarda da okuyabilirsiniz 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.

Bu nedenle, günün sonunda, umarım Linuxçalışmadaki farklı komutları anlamak için daha kolay bir zamanınız olur .


5
Çok güzel cevap. Bir aceminin dizi atamasının ne olduğunu, sadece koddan nasıl keşfettiğini ele alacağınızı umuyordum var=(), ama sanırım aradığınızın ismini bile bilmeden anlaşılması biraz fazla. . ;)
Wildcard

Fişsiz kabukları da destekliyor localmu?
palswim 13:16

2
Ben sadece giriş yaptım ki cevabınızı değiştirebilirim :)
Harendra Singh

@Wildcard Dizi bir komutun aksine bash sözdizimi olduğundan, onu tanımlanmış olarak bulabilirsiniz man bash. İçeri girdikten sonra /Arrays$, dizilerdeki bölüme atlamak için yazın. (Bundan $sonraki Arraysadım, bölüm içindeki metin içi referanslar arasında gezinmeyi önlemek içindir.) Oradan fbir sayfa ileri gitmek veya bgeriye gitmek için yazabilirsiniz . Tip qİşiniz bittiğinde adam sayfasını çıkmak için.
Taylor Edmiston

Ayrıca, helpdaha fazla görmek istemiyorsanız, hiçbir argüman olmadan koşmak tüm bash yerleşiklerini listeler.
Taylor Edmiston

29

localAnahtar kelime birden çok değişkeni alabilir. Değişkenin bir değere sahip olması isteğe bağlıdır. Örneğiniz iki değişken bildirir cwordve words. wordsDeğişken boş bir dizi atanır.


18

localsadece şu anda tanımlanmış olan fonksiyonda kapsamı olan bir değişken bildirir, böylece ana çalıştırma ortamı değeri "göremez". localBir işlev dışında kullanamazsınız . Örnek

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

Çıktı: Yerel olmayan değişken

Böylece $onlyhere, fonksiyonun kapsamı dışında görünmüyordu.


Bu cevap, hızlı bir anlayışa ihtiyacı olanları daha anlamlı kılar.
Alex Raj Kaliamoorthy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.