Bunu bir kabuk betiğinde görüyorum.
variable=${@:2}
Ne yapıyor?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Farkı gör?
Bunu bir kabuk betiğinde görüyorum.
variable=${@:2}
Ne yapıyor?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Farkı gör?
Yanıtlar:
$@
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
,.
İş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
vars=( "${@:2}" )
$@
ve ${@}
aynıdır, ikincisi "daha doğru" sözdizimidir. Parantezleri kullanmanız gerekir ${@:2}
, çünkü $@:2
belirsizdir ve bu nedenle ${@}:2
aynı şey değildir.
Bu ksh
da bash
ve son sürümlerinde bulunan bir özellik zsh
.
İçinde ksh
ve 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 length
atlanmıştır) elemanları array
ile 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 bash
ve ksh93
ilk karakteri ile $IFS
(ya da hiçbir şey varsa $IFS
ile 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 :
, $0
da 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 zsh
ekledi, ksh
ancak öğe aralıklarını seçmek için kendi sözdizimine sahip.
Aksine ksh
ve bash
, zsh
diziler sayıl değişkenlerden farklı bir değişken tipidir, değil azdır ( zsh
başka değişken türü olarak ilişkilendirilebilir diziler vardır) ve endeks 1 yerine 0 olarak başlar.
Çünkü zsh
dizi elemanlarına erişirsiniz $a[first,last]
( last
sondan 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 ksh93
ve bash
, zsh
aynı zamanda bir kabul 0
birincisi 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.