Parametre listesini oluşturmak için kullanılan bash dizesi birleştirme


12

Bu bash parçası verildiğinde:

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}

Yankı PARMS dizesini beklendiği gibi gösterir, hiçbir hata görüntülenmez, ancak rsync sessizce + = tarafından eklenen seçenekler mevcut değil gibi davranır. Ancak, bu beklendiği gibi çalışır:

PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}

Sanırım bash tırnaklarla bir şey berbat ettim (her zaman bunlarla ilgili problemler vardı), ancak dize doğru bir şekilde inşa edilmiş gibi görünse de seçeneklerin neden ve neden göz ardı edildiğinden emin değilim.


1
echo "$PARMS"and rsync "${PARMS}"...
jasonwryan

Bu benim için bash4.2.25 sürümünde hiçbir değişiklik yapmadan çalışır .
Anthon

Yanıtlar:


17

Arasında bir fark var:

PARMS+="... --exclude='.git'"

ve

... --exclude='.git'

İlkinde, tek tırnak işaretleri tırnak içinde, bu yüzden tam anlamıylarsync argüman olarak verilen ikame metinde bulunurlar . rsyncdeğeri olan bir argüman alır --exclude='.git'. İkincisi, tek tırnaklar yazıldıkları sırada kabuk tarafından yorumlanır, çünkü tırnak içinde değillerdir ve rsyncgörmeye başlarlar --exclude=.git.

Bu durumda, tek tırnaklara hiç ihtiyacınız .gityoktur - özel karakterleri olmayan, kendi başına mükemmel geçerli bir kabuk kelimesidir, böylece tam anlamıyla komutta kullanabilirsiniz.

Bu tür şeyler için daha iyi olsa da, bir dizi :

PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"

Bu, komutunuzu, ayrı ayrı sözcükler olarak oluşturur ve dizi satırını yazdığınız sırada hangi alıntıyı yorumlamanızı sağlar. dizideki her girdiye ayrı bir bağımsız değişken olarak "${PARMS[@]}"genişler , bağımsız değişkenin kendisinde özel karakterler veya boşluklar olsa bile rsync, ne demek istediğinizi yazdığınızı görür.


bashyapılan kelime ayırma ${PARMS}genişletildi. Yani tek alıntı da kabuk tarafından yorumlandı.
cuonglm

2
Dene! Yaptım. Alıntılar kalır ve eğer aralarında boşluk varsa, bunlar yine de bölünmüş noktalardır.
Michael Homer

@Gnouc: bash adam sayfasından: "Alıntı Kaldırma: Yukarıdaki açılımları sonra karakterlerin hepsi tırnaksız oluşumları \ , 've ". Kaldırılır yukarıdaki açılımları birinden yol açmamıştır" "yukarıdaki açılımlar", genişletmesini gerçekleştiren Parametre Genişletme'yi içerir ${PARMS}.
camh

Teşekkürler. Bu durumda, çift tırnak içindeki tek tırnak işaretlerini atlamanın işe yarayacağını anlıyorum ama bütünlük uğruna - bazı özel karakterleri alıntılamam gerekirse ve ikinci yaklaşımınızı kullanmak istemiyorsam ne olacak?
neuviemeporte

Özel karakterleriniz IFS(genellikle beyaz boşluk) bir parçası değilse , bunları tırnak içine almanıza gerek yoktur. Eğer öyleyse, bir şeyi hacklemediğiniz sürece şansınız evalkalmaz - bu genel olarak bir yanlışlıktır ve diziler bununla başa çıkmanın doğru yoludur.
Michael Homer

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.