Bash yazma ile alakalı bi kaç soru

Başlatan Skywalker87, 25 Nisan 2009 - 20:16:20

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Skywalker87

Selam arkadaşlar benim bir kaç sorum olucak.

Ben kullanıcıdan tarihi gün ay yıl ( 25 Nisan 2009 ) tarzında alıp ekrana girilen günün hangi güne denk geldigini ekrana yazan bir bash yazmak istiyorum.
terminalde bashi çalıştırmak için komutu yazdıgım satırda örn : 
./test.sh 25 Nisan 2009
olucak ve buna göre sonuç yazıcak.

1) Ben bu tarihi nasıl okutabilirim read yaptırmadan?
2)Okutma işlemini yaptıktan sonra ben bunları $1 $2 $3 şekilinde degerlere atmak istiyorum bu atamayı yaptırdıktan sonra tarihi date i çagırarak nasıl karşışlatırıp bir değer döndürebilirim?

Görüş ve fikirleriniz içinde şimdiden teşekkürler  :)
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

heartsmagic

Eğer İngilizcen varsa mutlaka bir "bash programming" belgesi bul :) Aksi takdirde çok zorlanırsın.

Çok anlamam bu işten ancak eğer elle tarih gireceksen:

gun=$1
ay=$2
yil=$3

şeklinde alıp bunları kullanabilirsin.
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.

Skywalker87

Tarih elle girilicek ewt
Düşünceni paylaştığın için teşekür ederim evet bu şekilde tanıyor ancak bir kaç sorun var başka bi şekilde yapabilirmiyiz onu merak ediyorum
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

bytan

Tabii ki başka şekillerde de olur. Ama nasıl istiyorsun, sorunlar neler gibi sorulara kendi açından yanıt vermelisin ve biraz kaynak karıştırmalısın. Sen iki  üç satır yazmaya başladığında, takıldığın, tıkandığın yerde yardımcı olmaya çalışırız forum olarak.
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

Skywalker87

Ben şuanda araştırıyorum  4 saat oldu ing kaynakları okuyorum kodun kısa ama fonksiyonel olmasını istiyorum =) bilmiyorum çok şeymi istiyorum.

Şuanda değeri okutma işlemi tamam ancak hataları engellemek amacıyla string olarak girilen ay adını Uppercase yada Lowercase olarak aldırmak istiyorumki sorun çıkmasın. Ardında date komutunu çağırıp döndürdüğü değeri parçalatıp okutma işlemi sırasındaki gibi 3 parçaya ayırmak istiyorum gün ay yil tarzında.

Şuanda kafamı en çok kurcalayan date komutunu nasıl kullanıcağım. ???
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

heartsmagic

İki yöntem geliyor aklıma.

1. Hem küçük hem büyük harf kontrolü yapacaksın.
2. Girilen değeri büyük veya küçük harfe sen çevirip, kontrolü buna göre yapacaksın.

date için cut kullan. cut ile date çıktısının istediğin bölümlerini alabilirsin. Bunun için aslında sed-awk falan da kullanılabilir belki ama onları da anlamak, öğrenmek, kullanmak yoğun bir iş.
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.

Skywalker87

#6
#!/bin/bash

yil=$1
ay=$2
gun=$3

$sonuc=date +%A tr "$1$2$3"

{
selec $sonuc in

(MONDAY | monday)$sonuc="Pazartesi";;
(TUESDAY | tuesday)$sonuc="Sali";;
(WEDNESDAY | wednesday)$sonuc="Carsamba";;
(THURSDAY | thursday)$sonuc="Persembe";;
(FRIDAY | friday)$sonuc="Cuma";;
(SATURDAY | saturday)$sonuc="Cumartesi";;
(SUNDAY | sunday)$sonuc="Pazar";;

esac
}



die bişi yazdım ama hala araştırmaya devam ediyorum bu kodda ise command line hataları veriyor anlamadım neden dolayı =)

Aslında yapmak istedigim olay kullanıcıdan tarihi alıp date komutuna atamak ve date in buna göre bana günü vermesini saglamak
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

heartsmagic

İlk gördüğüm hatayı söyleyeyim:

yil= $1
ay= $2
gun= $3


değil

yil=$1
ay=$2
gun=$3


olarak dene.

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.

such

Tam alakalı mı bilmiyorum ama mesela 7. Ay 1982 yi görüntülemek için cal 7 1982 yazmak yeterli.


Skywalker87

#!/bin/bash
yil=$1
ay=$2
gun=$3

$sonuc=date +%A tr "$1$2$3"

{

selec $sonuc in

(MONDAY | monday)$sonuc="Pazartesi";;
(TUESDAY | tuesday)$sonuc="Sali";;
(WEDNESDAY | wednesday)$sonuc="Carsamba";;
(THURSDAY | thursday)$sonuc="Persembe";;
(FRIDAY | friday)$sonuc="Cuma";;
(SATURDAY | saturday)$sonuc="Cumartesi";;
(SUNDAY | sunday)$sonuc="Pazar";;

esac

}



Kod u elden tekrar geçirdim fakat sürekli date i tanımladıgım satır ve select yapısının oldugu satırlardan hata alıyorum

@such  Teşekkür ederim ama benim istediğim bu şekilde degil ./test.sh 19 Mayıs 1919 yazıp enter a bastıgım anda ekrana Pazartesi yazmasını istiyorum :)
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

such

Alıntı yapılan: Skywalker87 - 25 Nisan 2009 - 23:49:20
#!/bin/bash
yil=$1
ay=$2
gun=$3

$sonuc=date +%A tr "$1$2$3"

{

selec $sonuc in

(MONDAY | monday)$sonuc="Pazartesi";;
(TUESDAY | tuesday)$sonuc="Sali";;
(WEDNESDAY | wednesday)$sonuc="Carsamba";;
(THURSDAY | thursday)$sonuc="Persembe";;
(FRIDAY | friday)$sonuc="Cuma";;
(SATURDAY | saturday)$sonuc="Cumartesi";;
(SUNDAY | sunday)$sonuc="Pazar";;

esac

}



Kod u elden tekrar geçirdim fakat sürekli date i tanımladıgım satır ve select yapısının oldugu satırlardan hata alıyorum

@such  Teşekkür ederim ama benim istediğim bu şekilde degil ./test.sh 19 Mayıs 1919 yazıp enter a bastıgım anda ekrana Pazartesi yazmasını istiyorum :)

Selec yazan yer select olması gerekiyor galiba :s pek anlamam ama.

heartsmagic

Dediğim gibi bir çırpıda olacak şeyler değil bunlar. İlgili alanları derinlemesine okuyarak çözmen lazım olayları.
Aksi takdirde her aşamada yardım almak zorunda kalırsın ki açıkçası bizler de o kadar uzman sayılmayız :)

Örneğin değişkenler

$falanca=... gibi tanımlanmaz.
falanca=... gibi tanımlanır, ardından $falanca olarak kullanılır.

Değişkenler için komut kullanacaksan:

falanca=falanca_komut
değil
falanca=`falanca_komut` (Dikkat et ' değil `)
veya
falanca=$(falanca_komut)
şeklinde tanımlanır.

Eğer yapmak istediğin şey acil değilse, güzel bir belgeyi baştan aşağıya kadar, uygulamalı bir şekilde oku.
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.

Skywalker87

Tamam teşekkür ederim ben uğraşmaya devam ediyim aciliyeti var aslında yarın akşama kadar =)

Bu arada önerebiliceğiniz kaynalaklar varmı?
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

heartsmagic

Google'a "bash programming howto" dersen derya kadar kaynak çıkar :) Ancak İngilizce gerekiyor o noktada. Eğer Türkçe istiyorsan buna göre bir arama yap.
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.

Skywalker87

#14
Howto lar la benim derdim çözülmüyor :)  10 tane farklı kaynak okudum 7 saat içinde
Benim derdim date e atama yapabilmek date e eger elimdeki değeri atayabilirsem sorun bitmiş olucak onu araştırıyorum hala o atamayı yaptırdıktan sonra %A ya göre kontrol yapıcam ve yazdırıcam

#!/bin/bash
yil=$1
ay=$2
gun=$3
sonuc="$1$2$3"
sonuc="`echo $sonuc|tr [a-z] [A-Z]`"

sky=`date +%A`
echo $sky


Bu eksik ama inş yarın akşama sizlerinde yardımıyla bitimiş olucam :)

Vakit ayırıp değerli fikirlerinizi paylaştığınız için çok teşekkür ederim.
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

bytan

Date komutu ile bunu yapabileceğini sanmıyorum. İstediğiniz şey, tarihi kullanıcıdan almak ve o tarihin gününü ekrana  basmaksa, sistem tarihini ayarlamaya çalışan date komutu sizin isteğinizi karşılamak için biraz farklı olmuş oluyor. Eğer diyorsanız ki bu sorun değil, önce date -s ile verilen tarihi string olarak sisteme girdirip, sonrasında date %A ile istediğiniz formatta okuyabilirsiniz. Date komutunun falanca tarihin gününü vermek gibi bir özelliği varsa ben bilmiyorum. Ve böyle bir durumda bu yazdıklarımı da dikkat almayın.

Öneri olaraksa @such'ın sunduğu cal komutu üzerinde @heartsmagic'in cut, sed, awk tavsiyelerini kullanmanızı verebilirim.
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

erginemr

Bir de "selec $sonuc in" bölümünde "selec" yerine "case" mi kullanılmalı? (Zira bu bölümü "esac" ile kapatıyorsunuz.)

Skywalker87

#17
Selam arkadaşlar kodu 5 farklı versiyon halinde yazdım bitti yardımlarınız için teşekkürler

Bitanesini buradan paylaşıyım diğer arkadaşlarımızada lazım olur  ;)

#!/bin/bash
aylar=(ocak subat mart nisan mayis haziran temmuz agustos eylul ekim kasim aralik)
days=(Monday Tuesday Wednesday Thursday Friday Saturday Sunday)
gunler=(PAZARTESI SALI CARSAMBA PERSEMBE CUMA CUMARTESI PAZAR)
mm=`echo $2 | tr "[A-Z]" "[a-z]"`
for i in `seq 0 11`;
do
if [ "$mm" = "${aylar[$i]}" ];
then let num=$i+1;
break fi
done
deger=`date +%A -d "$3-$num-$1"`
for i in `seq 0 6`;
do
if [ "$deger" = "${days[$i]}" ];
then echo "${gunler[$i]}";
break fi
done
The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

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.

Skywalker87

The Bird Of Hermes Is My Name.Eating My Wings To Make Me Tame

Only the strongest will survive
Lead me to heaven when we die  I have a shadow on the wall  I'll be the one to save us all

heartsmagic

Ben denediğimde çalışmıyordu. Bir ara tekrar bakmaya çalışırım.
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.

bytan

tarih.sh adıyla kaydedip yaptığım iki denemede aldığım çıktı:

jaunty@jaunty-desktop:~$ ./tarih.sh 12 subat 2009
./tarih.sh: line 11: syntax error near unexpected token `done'
./tarih.sh: line 11: `done '

jaunty@jaunty-desktop:~$ ./tarih.sh
./tarih.sh: line 11: syntax error near unexpected token `done'
./tarih.sh: line 11: `done'

Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST