bash programlamada -n parametresi

Başlatan sayz, 31 Aralık 2012 - 22:47:37

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

sayz

a="string"
b=""

if [ -n $a ]; then
        echo olumlu
else
        echo olumsuz
fi


merhaba;

örneğin yukarıdaki kodda -n parametresini verdiğimiz zaman boş olmayan stringler için ekrana olumlu basması, boş olan stringler için de olumsuz basması gerekmez mi? ama ben orada değişkeni $a da versem $b de versem her türlü olumlu basıyor ekrana. örneğin -z parametresi sorunsuzca çalışıyor ama -n deki bu garipliği çözemedim.

ersinkandemir

"-n" NULL'ı temsil ediyor anladığım kadarıyla. Yani içi boş bir stringle de olsa tanım yaptıysanız NULL değildir artık.
Where there's a shell, there's a way.



sayz

Alıntı yapılan: Ersin Kandemir - 31 Aralık 2012 - 23:08:45
"-n" NULL'ı temsil ediyor anladığım kadarıyla. Yani içi boş bir stringle de olsa tanım yaptıysanız NULL değildir artık.

-n   nonzero'yu ifade ediyor burada, -z de zero'yu ifade ediyor.

ersinkandemir

Pardon, örneği yanlış anladığım için yanlış yorumlamışım. :)


Ben bir şey çıkartamadım fakat buradaki tablodan bir şeyler öğrenebiliriz belki:

http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055#3870055
Where there's a shell, there's a way.



sem

Aslında BASH'te tür kavramı yok, aksi belirtilmediği sürece daima tüm değişkenler String olarak ele alınıyor. Bu nedenle işlem bana açıkcası çok anlamlı gelmedi. Belki vardır bir üstad bunu açıklayabilecek =)


if kısmını açıkca string olarak olduığunu belirtirseniz ifade düzgün çalışıyor (maaesef, maalesef diyeyim çünkü nedeni bana göre saçma daha doğrusu nedenini bilmiyoruz tam olarak =))




Yani şu şekilde olmalı;




a="string"
b=""




if [ -n "$b" ]; then
        echo olumlu
else
        echo olumsuz
fi
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

heartsmagic

-n parametresi tanımlanıp tanımlanmamaya bakıyor, -z ise boş olup olmamasına. Kısacası eğer bir dizi tanımlanmışsa -n olumlu döner diye düşünüyorum.

Gerçi tldp öyle dememiş sanki, evet kafa karıştırıcıymış.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

sem


Aynen, karışık biraz... Çünkü öyle olsaydı yukarıda b kontrolünün olumlu dönmesi gerekirdi fakat b olumsuz dönüyor...


if [ -n "$b" ];


olumsuz dönüyor


if [ -n $b ];


olumlu dönüyor.


Belki şöyle denilebilir; "" arasında iken string doluluğu kontrolü yapılıyor. "" olmadan doğrudan değişken koyulduğunda ;


if [ -n $b ];


değişkenin varlığı kontrol ediliyor... [size=78%]En azından öyle davranıyor şu anda =)[/size]
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

juggle

-n: Eğer string sıfır boyutlu değilse true olarak dönüyor. Sanırım a="" yaptığımız zamanda bi string ataması yapılmış gibi görüyor.


-z: eğer string sıfır boyutlu ise true dönüyor. Aşağıdaki şekilde yapınca




a=""


if [ -z "$a" ]; then
echo "Boş"
else
echo "Boş değil"
fi


bu sefer sonuç Boş olarak dönüyor.
what goes around comes back around

cagriemer

Ben de bu konuya bir ara kafayi takmistim. Dogrudan bash man sayfasindan ilgili kisimlari kopyalayip yorumlayacagim.

Word splitting bolumunden

Alıntı YapExplicit  null  arguments  (""  or '') are retained.  Unquoted implicit null arguments, resulting from the expansion of parameters that have no values,  are  removed.  If a parameter with no value is expanded within double quotes, a null argument results and is retained.

Unquoted implicit null argument dedigi b="" diye tanimlayip $b olarak cagirdigimiz deger. Eger bu deger tirnak icerisinde "$b" olarak cagirilmazsa word splitting nedeniyle siliniyor. Dolayisiyla test ifademiz suna donuyor [ -n ].

Test bolumunden arguman sayisiyla ilgili kisim

Alıntı Yaptest and [ evaluate conditional expressions using a set of rules based on the number of arguments.
             1 argument
                     The expression is true if and only if the argument is not
                     null.

Eger tek bir argumaniniz varsa bu arguman bos olmadigi surece dogru dondurur diyor. Yani [ -n ] her zaman dogru olarak donecek anlamina geliyor bu da. Dolayisiyla [ -n $b ] --> [ -n ] --> true seklinde aciliyor o ifade. O yuzden if dogru gibi algiliyor.

heartsmagic

Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.