2016-03-25 17 views
1

anlama indirection. ${#V}, ${#$V} ve ${$V}: Gördüğünüz gibi, değişkenler burada devam şeylerden üç farklı tipi vardırŞu anda bazı kabuk komut dosyalarını temizlemeye çalışıyorum

if [ ${#VARA} -eq 0 ] || [ ${#$VARB} -eq 0 ] || [ ${$VARC} -eq 0 ]; then 
    ... 
fi 

: Bunu yaparken, ben şöyle bir şey geldi. Bunların her birinin bir açıklamasını çok isterim. (Ayrıca, son bir ilgili Shellcheck is complaining.)

+1

Benim bash 2 biri hakkında zaten şikayet ediyor. Hangi kabuk? Orijinal yazar ne yaptığını bilmiyordu ve üçünü de denedi. Birincisi, VARAs değerinin dize uzunluğudır. – Harald

+0

@Harald bunun için çok iyi bir şans var. Ve evet, bu Bash. Söz konusu satır çok büyük bir senaryoda. Kullanıldığına dair söz veremem, ama daha önce hiç bu sözdizimini görmediğim için ilginç olduğunu düşündüm. –

+0

Hayır, onu görmediniz mi, işe yaramazsa (1 hariç) :-) Ya da belki de bash'ın eski versiyonlarında çalıştı. – Harald

cevap

1

Bu sözdizimi POSIX'deki parçasıdır (Bash oradan) kabuk parametresi genişletme. Bu bir değişken için karakter sayısını sayar:

$ myvar="foo" && echo ${#myvar} 
3 

son iki olanlar ${#$VARB} ve ${$VARC} geçerli bir sözdizimi yok. Bu şekilde bir değişken bildiremezsiniz. senin ${$VARC} biraz benzer olarak

eval veya echo ile indirect reference için kullanılan, geçerli \$$myvar olduğunu. Bu sözdizimi değişmezi dize "$foo" (myvar="foo") ifade eder. @chepner'den bahsedildiği gibi, because of eval, kullanılması önerilmez. Bash 2.0, çok tercih edilen bir alternatif olan dolaylı değişken referans için ${!myvar} sözdizimini tanıttı.

Not: Ayrıca Kongre tarafından Büyük harfli olan kabuk değişkenleri ile karıştırmamak değişken adları için büyük harf kaçınmalıdır.

+1

'$ {# myvar}' sadece 'bash' değil, POSIX kabuk belirtiminin bir parçasıdır. VARC' $$ – chepner

+1

'diğerdeğişken = \ othervar' değişmez dize' (foo' '$ VARC' genişlemesi ise' varsa) $ foo' için 'ayarlar. – chepner

+0

Teşekkürler @chepner. Benim yaklaşımlı formülasyonumu güncelledi. – SLePort

İlgili konular