Bu $ {@: 2} kabuğunun komut dosyasında anlamı nedir


27

Bunu bir kabuk betiğinde görüyorum.

variable=${@:2}

Ne yapıyor?


Tam olarak senaryoda gösterildi mi? Sözdizimi bir diziye benziyor ancak bazı parçalar eksik. Lütfen bu satırın etrafındaki birkaç satırı senaryodan gönderebilir misiniz?
slm

Bu ikinci harften başlayan bir değişkendir. var="my_value"; echo var="${var[@]:2}"; echo "$var"Farkı gör?
Valentin Bajrami 30:13

Yanıtlar:


34

$@Bash'de özel değişkenin içeriğini gösteriyor . Tüm komut satırı argümanlarını içerir ve bu komut ikinci argümandaki tüm argümanları alıp değişkende saklar variable,.

Örnek

İşte bir sınav komut dosyası.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Örnek çalışma:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Referanslar


9
Gösterilen tekniğin verilen argümanları tek bir dizgede ezdiğini unutmayın. Bunları ayrı argümanlar olarak tutmanız gerekiyorsa, bir dizi kullanın:vars=( "${@:2}" )
glenn jackman 30:13

@glennjackman - Bunu gösterdiğin için teşekkürler.
slm

2
Ayrıca kıvrımlı parantezlerin kullanıldığına dikkat edin. Her zaman küme parantezleri kullanmanız gerekir, ancak içerik belirgin olmadığında Bash bunları atlamanıza izin verir. Bu nedenle $@ve ${@}aynıdır, ikincisi "daha doğru" sözdizimidir. Parantezleri kullanmanız gerekir ${@:2}, çünkü $@:2belirsizdir ve bu nedenle ${@}:2aynı şey değildir.
Paddy Landau

14

Bu kshda bashve son sürümlerinde bulunan bir özellik zsh.

İçinde kshve bash, kullanarak bir dizinin çeşitli öğeleri erişebilir ${array[@]:first:length}için kadar genişler sözdizimi, length(veya eğer tüm lengthatlanmıştır) elemanları arrayile başlanarak, dizinin (dizinin elemanları listesinde işaretlerde sayısal kriteri) ilk indeks büyük veya eşittir first. Skaler bağlamda (burada sayıl değişkene bir atama gibi) elemanların listesi ile uzay karakterlerle katıldığında bashve ksh93ilk karakteri ile $IFS(ya da hiçbir şey varsa $IFSile bu ayar kaldırılamaz ise boş veya uzay) zsh.

Örneğin:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@özel bir durumdur. $@konumsal parametrelerin dizisidir ( $1, $2...). İle kullanıldığında Fakat :, $0da dahildir. Yani ${@:1}aynı $@, ${@:0}diğer diziler için olduğu gibi değil .

İçinde zsh, biraz farklı. sözdizimini yalnızca yakın zamanda uyumluluk için zshekledi, kshancak öğe aralıklarını seçmek için kendi sözdizimine sahip.

Aksine kshve bash, zshdiziler sayıl değişkenlerden farklı bir değişken tipidir, değil azdır ( zshbaşka değişken türü olarak ilişkilendirilebilir diziler vardır) ve endeks 1 yerine 0 olarak başlar.

Çünkü zshdizi elemanlarına erişirsiniz $a[first,last]( lastsondan geriye doğru saymak negatif olabilir).

olarak zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

çoğu boş olan 235 elemanlı bir dizi yaratır. $a[12,50]elemanlar 12 ila 50'ye ${a[@]:12:2}genişler ve sadece (boş) $a[12]ve $a[13]elemanlara genişlerdi . Özel bir durum olarak ve yine birlikte taşınabilirlik için ksh93ve bash, zshaynı zamanda bir kabul 0birincisi için eleman $@olduğu gibi davranır $0.

Böylece, 3 kabuğun tamamında ${a[@]:x:n}ve ${@:x:n}taşınabilir olarak kullanabilirsiniz , ancak yalnızca seyrek olmayan diziler için ve IFS'in değerine dikkat edin.

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.