“$ {My_array [@] / # / -}” içinde / # / - ne tür bir işlemdir?


17

Bir diziyi komut argümanlarına dönüştürmek için kabul edilen cevap ? aşağıdaki Bash komutunu kullanır:

command "${my_array[@]/#/-}" "$1"

Parçanın /#/-tam olarak ne yaptığını anlamaya çalışıyorum . Ne yazık ki, ne diyeceğimi bilmiyorum, bu yüzden herhangi bir belge bulmakta sorun yaşıyorum. Dizilerde ve birkaç web sitesinde Bash man sayfa bölümünü inceledim, ancak hiçbir şey bulamıyorum.

Yanıtlar:


24

Bu, kabuk parametresi genişletmesindeki desen değiştirme örneğidir : ${parameter/pattern/replacement}genişler ${parameter}, ilk örneğini patternbununla değiştirir replacement. Bu tür bir desen bağlamında #özeldir: deseni parametrenin başlangıcına sabitler. Tüm bunların sonucu, my_arraydizideki tüm değerleri , -her birine göre önceden genişletmektir (her parametrenin başındaki boş modeli değiştirerek).


2

Evet, kabuk parametre genişletmesinde aşağıdaki gibi bir model değiştirme işlemidir :

${parameter/pattern/replacement}

Fakat ilk sonraki ilk karakter ise /ya /ya# ya da %özel bir anlamı varsa all(tekrarlanan) startve end.

ile:

$ str='one_#two_two_three_one'

Bir tek / örnek ilk örneğin yerini alacaktır. İlk örneği one:

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

Veya ilk örneği two :

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

Örneği one :

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

Tüm tekrarları two :

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

Örneği one :

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

İle başlayan bir dize # (alıntı yapın #):

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

Ancak # (alıntılanmamış) işlevini yalnız bırakırsanız, değiştirme değişkeni başında ayarlanır:

$ echo "${str/#/====}"
====one_#two_two_three_one

Ayrıca, parametre bir dizi ise, değiştirme tüm öğelerde yapılır:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

İfadeler biraz yanıltıcıdır #ve %desenin bir parçasıdır ve aynı desenlerden //farklı bir operatördür /ve kullanır. Sahip olabilirsiniz pattern='#x'; echo "${var/$pattern}"(veya ${var//$pattern}), ancak pattern=/x; echo "${var/$pattern}"aynı değildir echo "${var//x}". Unutmayın #ve %birleştirilebilir zsh, ancak bashne de olamaz ksh.
Stéphane Chazelas
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.