[Çözüldü] Bash Script Öğrenirken Anlam Veremediğim Kurallar

Başlatan Kanguru, 24 Ağustos 2015 - 15:47:33

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Kanguru

Allah'ın selamı üzerinize olsun arkadaşlar.

Ben tldp ve tutorialspoint gibi sitelerden bash öğrenmeye çalışıyorum. Ama öğrenirken bash'de anlamsız ve nedenini hiçbir yerde bulamadığım kurallar var.
Mesela değişkene değer verirken şöyle kullanıyoruz: val=1 Başka yerlerde kullanırken $val diyoruz ama şöyle bir ifade de var: val=`expr $val + 1`
niçin şöyle de olmuyor? : $val=`expr $val + 1`
Kimi yerlerde if şöyle kullanılıyor if [[ ... ]], kimi yerlerde şöyle if (( ... )), aradaki fark yazılmamış. Şu şekilde ifadeler de var: $( ls ) ve $(( val++ )), vb. Peki bu parantezlerin tekli veya çiftli falan olması ne demektir? Bunları da öğrenebileceğim kaynaklar nelerdir?

Teşekkürler!

iskenderoguz

#1
değer atamak için sadece değişkenin ismini yazarsın.
değişkene atanmış değeri kullanmak için başına $ işareti koyarsın
yani

val=5         --> val değişkenine 5 değerini atadım
echo &val   --> val değişkeninin değerini ekrana yazdırdım


çift parantezlerle alakalı:
http://stackoverflow.com/a/2188369

siberoloji

#2
1.
Siz------------->Val-------------->1
Şimdi siz kullanıcı olarak 1 değerine ulaşamazsınız. Çünkü hafızada tutulduğu adresi bilmiyorsunuz. O zaman o hafıza adresini anlaşılır halde hatırlayabilmek için Val ifadesi bize gereklidir.
Soru:
Val nedir?
Cevap:
İçerisinde değişken bir değer tutan hafızanın adresinin ismi
Soru:
Şu anda içinde hangi değeri tutuyor?
Cevap:
$Val

Elimde 1 elma var
ifadesindeki 1 rakamının sürekli değiştiğini düşünelim.
Bazen "Elimde 3 elma var" yazmanız da gerekebilir.
Val=3
echo Elimde Val elma var
Elimde Val elma var
echo Elimde $Val elma var
Elimde 3 Elma var

Val değişkenin kendisini, $Val değişkenin içerisindeki tuttuğu değeri kullanmak içindir.
C programlamada c=c+1; yapılabilir ancak bash farklı oluyor.

2.
Soru:
Ekrana Ankaradayım yazdırır mısınız?
Cevap:
sehir=Ankara
echo $sehirdayım


yapamazsınız çünkü shell sehirdayım isminde bir değişken arayacaktır. Oysa
sehir=Ankara
echo ${sehir}dayım
Ankaradayım

şeklinde parantez içine almak ile shell (kabuğa) sadece parantez içindeki sehir ifadesi değişken, dayım ifadesi normal metin demiş olursunuz.
Parantez içine almak olmasaydı bu mümkün olmazdı.

3. köşeli parantez ve düz parantezleri de başka bir arkadaş anlatacaktır umarım.

Bunları nereden öğrenebilirsiniz. Çok okuyup, karıştırıp inceleyip unutmamak için not alarak öğrenebilirsiniz. Tek bir adres vermek çok zor.
Uzun zamandır böyle güzel soru görmemiştim. Cevaplarken mutlu oldum. ;)

Ben bir kısmını buradan öğrendim.
http://linux-training.be/linuxfun.pdf

Kanguru

@iskenderoguz ve @siberoloji teşekkürler.

@iskenderoguz verdiğin link yararlı parantez konularını öğrendim sayılır.

@siberoloji sanırım Ankara örneği çalışmıyor. Verdiğin linki inceliyorum.
Peki `` işaretleri ne işe yarıyor? 2 kullanım şekli gördüm: 1) `expr 1 + 1` 2) (expr 1 + 1)

siberoloji


heartsmagic

#5
Alıntı yapılan: Kanguru@siberoloji sanırım Ankara örneği çalışmıyor. Verdiğin linki inceliyorum.
Peki `` işaretleri ne işe yarıyor? 2 kullanım şekli gördüm: 1) `expr 1 + 1` 2) (expr 1 + 1)
Herhangi bir yerde kabuk üzerinde tanımlı bir komutu yürütmek için. Eski yöntemi `` kullanmaktı, hâlâ da geçerlidir. Daha moder yaklaşım ise $() şeklinde kullanmak. Şöyle örnekleyelim.

echo Bugünün tarihi: date

dersen haliyle şunu basar:

Alıntı YapBugünün tarihi: date
Fakat sen betiğinde tam orada tarihi basmak istiyorsun? İşte sorduğun yöntemle yaparsın bunu:

echo Bugünün tarihi: `date`veya
echo  Bugünün tarihi: $(date)

Başlığı da değiştirsek mi? :) Anlamsız değil görülebileceği üzere aslında. Parantezler kısmını anladım demişsin umarım öyledir. Zira onlar da anlamsız değil, test koşulları, alt kabuk açma gibi farklılıkları var.
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.

Kanguru

Anladığım kadarıyla şöyle:

- Tek Parantezliler -
 
  $() ->  Kısacası bash komutları çalıştırmak için kullanılıyor. $(ls) gibi.
  ${} ve {} -> Aslında tam olarak anlamadım. Yukarıdaki linkteki örnek: echo f{oo, ee, a}d Çıktı: food feed fad
 
- Çift Parantezliler -
 
  (())  -> Bu yazıldığına göre aritmetik işlemleri gerçekleştirmek içinmiş. ((1 + 1)) gibi.
           Ama echo ((1 + 1)) çalışmıyor, echo $((1 + 1)) 2 çıktısını veriyor.
  [] ve [[]] -> Aralarındaki farkı tam olarak anlamış değilim.
 
  Bu arada test koşulları ve alt kabuk açma terimlerini tam olarak bilmiyorum.
  Fakat alt kabuk açma dediği bilidiğim kadarıyla $() içinde yapılanlar.
 
  Teşekkürler. Başlığı da değiştireyim.

heartsmagic

$() kısmını doğru anlamışsın diyelim. Gerçi o doğrudan tek parantez değil, tek parantez için yabancı kaynaklara bakacaksan "subshell" konusuna bak. Şimdilik o dursun kenarda.

{} ve diğer parantezlerin farklı kullanım alanları var. Senin verdiğin örnekte genişletme yapılıyor. food feed fad kısmında f ve d ortak, bu nedenle yer ve zamandan kazanmak için genişletme yapılıyor basitçe. Şöyle bir kullanımı da var örneğin:
echo {1..10}

Kullanım örneği:
for i in {1..10};do echo $i;done

(()) doğrudur aritmetik işlemler için. Fakat kullanımı echo ile değil.
degisken=0
echo $degisken
((degisken++))
echo $degisken

Bunu yürütürsen önce degisken parametresi 0 sonrasında ise 1 basar.

[] koşul için test yapar, [[]] ise bir de araya regex sokmaya yarıyormuş. Bunu ben de yeni öğrendim.
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.

siberoloji

İşte özlediğim forum ubuntu...Nazar deymesin....

Kanguru

Hepinize çok teşekkür ederim.

Yavaş yavaş mesele hallolmaya başladı, uygulaya uygulaya pekişir diye düşünüyorum.

freeman

Ek olarak test komutunu anlarsan çoğu şeyi daha kolay anlamlandırırsın.
http://www.computerhope.com/unix/test.htm
Good morning and welcome to the Black Mesa Transit System. This automated train is provided for the security and convenience of the Black Mesa Research Facility personnel.

Suraka