bash, sh, csh, tcsh, ksh betik paylaşımları

Başlatan aysberg313, 10 Ocak 2016 - 08:06:25

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

aysberg313

Aşağıdaki üç konuda yapılan paylaşımlara benzer şekilde kullanıcıların/üyelerin kendi yazdıkları veya bir şekilde edinilmiş ve işlerini kolaylaştıran betiklerin de paylaşılabilecekleri bir konu sabitlense nasıl olur? Hem betik dili çalışan/öğrenen arkadaşlara bolca örnek çıkmış olur hem de işleri kolaylaştıracak betikler paylaşılmış olur.

https://forum.ubuntu-tr.net/index.php?topic=5.0
https://forum.ubuntu-tr.net/index.php?topic=3338.msg36527#msg36527
https://forum.ubuntu-tr.net/index.php?topic=170.0

Örnek olarak;

#!/bin/bash

# Bu script, Paket listelerini günceller, yükseltme işlemini gerçekleştirir,
# dağıtım yükseltir, kullanılmayan paketleri kaldırır, indirilmiş olan eski
# arşiv dosyalarını siler.

echo "1.) apt-get update"
echo "2.) apt-get upgrade"
echo "3.) apt-get dist-upgrade"
echo "4.) apt-get autoremove"
echo "5.) apt-get autoclean"
echo "6.) Hepsi"
echo "7.) Çıkış"

echo -n "Lütfen yapılacak işlem numarasını giriniz: "
read islem

case $islem in
1)
apt-get update
;;
2)
apt-get upgrade
;;
3)
apt-get dist-upgrade
;;
4)
apt-get autoremove
;;
5)
apt-get autoclean
;;
6)
apt-get update && apt-get upgrade && apt-get dist-upgrade && apt-get autoremove && apt-get autoclean
;;
7)
exit
;;
*)
echo "Hatalı seçenek!!!"
;;
esac


Sevmezdim kabuklu yemiş, Linux çekirdeği tadıncaya dek !..

ahmet_matematikci

♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

sayz

Madem böyle bir konu açıldı öğrenciyken yazdığım ilk kabuk betiğimi koyayım buraya  :D

#!/bin/sh
#girilen kullanıcı adının sistemde olup olmadığını kontrol eden shell scripti

echo -n "sorgulamak istediğiniz kullanıcı adı> "; read nick


#'dizin mi?' ile
    # 'nick' adında bir kullanıcı varsa, 'home' altında da bir 'nick' dizini vardır.

if [ -d /home/$nick ]; then
    echo "sistemde $nick kullanıcısı mevcut"
else
    echo "sistemde $nick diye bir kullanıcı mevcut değil"
fi

#passwd dosyası ile

PASSWD_FILE=/etc/passwd

if grep $nick $PASSWD_FILE 2>/dev/null 1>2; then
    echo "sistemde $nick diye bir kullanıcı mevcut"
else
    echo "sistemde $nick diye bir kullanıcı mevcut değil"
fi


not: yıllar önce yazdığım bir betiktir şu anda denemedim.

aysberg313

@sayz, teşekkürler, denendi ilk günkü gibi çalışıyor tekrar teşekkürler.
Sevmezdim kabuklu yemiş, Linux çekirdeği tadıncaya dek !..

ahmet_matematikci

@sayz bir de ne işe yaradığı hakkında bir iki cümle versen süper olurdu. :D
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

aysberg313

@ahmet_matematikçi, @sayz'in eklediği betik sistem genelinde belli bir kullanıcının olup olmadığını sorgulamakta (kullanıcı dizinlerinin oluşturulduğu /home dizinini ve kullanıcı bilgilerinin tutulduğu /etc/passwd dosyasını referans alarak). Belki ev veya küçük ofis tarzı az kullanıcı barındıran sistemlerde değil ama üniversite ve benzeri ortamlarda kullanılan ve çok fazla kullanıcı barındıran sistemlerde kullanılabilir.
Sevmezdim kabuklu yemiş, Linux çekirdeği tadıncaya dek !..

ahmet_matematikci

♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

heartsmagic

Sabitleyelim ama burada durmasın bence, programlama tarafına alalım.
Ayrıca, bence bu betiklerin mümkün mertebe ne işe yaradığını anlatmaya çalışın ki forum dizinine girsin, aramada çıksın.
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.

betseg

Biraz geliştirelim dedim :) umarım düzgün olur, telefondan yaptım.
#!/bin/bash

# Bu script, Paket listelerini günceller, yükseltme işlemini gerçekleştirir,
# dağıtım yükseltir, kullanılmayan paketleri kaldırır, indirilmiş olan eski
# arşiv dosyalarını siler, yeni paket kurar, paket kaldırır.

echo "1.) apt-get update"
echo "2.) apt-get upgrade"
echo "3.) apt-get dist-upgrade"
echo "4.) apt-get autoremove"
echo "5.) apt-get autoclean"
echo "6.) Üsttekilerin hepsi"
echo "7.) apt-get install"
echo "8.) apt-get remove"
echo "9.) Çıkış"

echo -n "Lütfen yapılacak işlem numarasını giriniz: "
read islem

case $islem in
1)
apt-get update
;;
2)
apt-get upgrade
;;
3)
apt-get dist-upgrade
;;
4)
apt-get autoremove
;;
5)
apt-get autoclean
;;
6)
apt-get update && apt-get upgrade && apt-get dist-upgrade && apt-get autoremove && apt-get autoclean
;;
        7)
                read paket
                apt-get install $paket
                ;;
        8)
                read paket
                apt-get remove $paket
                ;;
9)
exit
;;
*)
echo "Hatalı seçenek!!!"
;;
esac

ahmet_matematikci

@betseg şimdi bu betik nasıl kullanılacak. Kopyalayıp konsola mı yapıştırıyoruz yoksa bir txt mi kaydedip farklı kaydediyoruz.
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

betseg

betik.sh olarak kaydediyorsun, chmod +x betik.sh diyorsun ve sudo ./betik.sh olarak çalıştırıyorsun.

ahmet_matematikci

♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

programmer

Ben de iso bağlamak için yazdığım bir bash betiği paylaşayım. "mount-iso "olarak adlandırmayı yeğledim. Hata kodu işleme açısından da öğretici olabilir sanıyorum.






#!/bin/bash
# mount komutunda birden fazla türde hata oluşabilir.
# bu hatalar 8 baylık hata koduna bit işlemi OR işlemi ile bileştirelerek verilir
# Her tür için ayıklama yapmak amacıyla bit işlemi and (&) ile bu türleri ayıkladım.
target_dir=/media/iso
ISO=$1
if [ -f $ISO ]
then
sudo mount -o ro,loop $ISO $target_dir >/dev/null 2>&1
error_code=$?
#echo $error_code
(($error_code == 0)) && echo "mount işlemi başarılı"
((($error_code & 1) == 1 ))  && echo "iso zaten bağlı veya izin hatası"
((($error_code & 2) == 2 )) && echo "Sistem hatası"
((($error_code & 4) == 4 )) && echo "İçsel mount hatası veya mount'da nfs desteği hatası"
((($error_code & 8) == 8 )) && echo "Kullanıcı kesmesi"
((($error_code & 16) == 16 )) && echo "Yazma veya /etc/mstab kilitleme hatası"
((($error_code & 32) == 32 )) && echo "mount komutu hatası"
((($error_code & 64) == 64 )) && echo "Bazı bağlamalar başarılı"
else
  echo "$ISO  bulunamadı."
fi

Empat

Temel Bash bilgimle her sistem açılışında otomatik çöp kutusunu temizleyen ve Xampp programını başlatan, yaptıklarını belirttiğim dosyaya saatiyle beraber kaydeden bir script yazdım. Bilgisayar tamamen benim olduğu için ~/.bashrc dosyasını, parola istemeden sudo ile işlem yapabileceğim şekilde düzenledim. Script'i sistem açılışında otomatik başlatılması için ilgili dizine ekledim. && operatörü yerine eş değer olan ; operatörünü kullanarak diğer dillerden edindiğim alışkanlığımı da uygulamayı ihmal etmedim. :)

Eğer başlangıçta otomatik olarak bir şeyler çalıştırmak için bir script isteyen olursa, zahmet olarak görmeden, zevkle elimden geldiği kadar yazarım.

#!/bin/bash

if [ $USER == mahmut ]
   then
       sudo rm -rf /home/mahmut/.local/share/Trash/files/*;
       date >> /var/log/startupSettings/removedLogs;
       sudo echo "Kullanıcının 'mahmut' kullanıcısı olduğu doğrulandı.'mahmut' kullanıcısının çöp kutusu boşaltıldı." >> /var/log/startupSettings/removedLogs;
       sudo echo "--------------------------------------------------------------------------------" >> /var/log/startupSettings/removedLogs
   else
       date >> /var/log/startupSettings/removedLogs;
       sudo echo "'mahmut' kullanıcısının çöp kutusu boşaltılamadı." >> var/log/startupSettings/removedLogs;
       sudo echo "--------------------------------------------------------------------------------" >> /var/log/startupSettings/removedLogs
fi

if [ $USER == mahmut ]
   then
       sudo /opt/lampp/lampp start;
       date >> /var/log/startupSettings/lamppLogs;
       sudo echo "Kullanıcının 'mahmut' kullanıcısı olduğu doğrulandı. 'lampp' servisi başlatıldı. PID numarası / numaraları: " >> /var/log/startupSettings/lamppLogs;
       sudo pgrep lampp >> /var/log/startupSettings/lamppLogs;
       sudo echo "--------------------------------------------------------------------------------" >> /var/log/startupSettings/lamppLogs
     
   else
        date >> /var/log/startupSettings/lamppLogs;
        sudo echo "Kullanıcının 'mahmut' kullanıcısı olduğu doğrulanamadı veya belirlenemeyen bir nedenden dolayı 'lampp' servisi başlatılamadı." >> /var/log/startupSettings/lamppLogs;
        sudo echo "--------------------------------------------------------------------------------" >> /var/log/startupSettings/lamppLogs
fi
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

mhmtkrktr

Alıntı YapBilgisayar tamamen benim olduğu için ~/.bashrc dosyasını, parola istemeden sudo ile işlem yapabileceğim şekilde düzenledim.

Bu durum, güvenlik duvarını aşabilecek herkesin şifreni de öğrenebilme ihtimalini ortaya çıkartmaz mı?

Öneri olarak; root yetkisi isteyen betikler için daha güvenli iki yol,

1: systemd servisi oluşturmak
2: betiğin sahibini root olarak ayarlamak ve sudoer dosyasına tanımlamak.

Sudo şifresi gerektirecek birden çok betik çalıştırılacak ise, tüm betikler için yukarıda ki yöntemlerden birisi kullanılarak ana betik hazırlanabilir. Diğer betikler bu betiğin üzerinden çalıştırılır.

if

@Empat,

Ben de temel Bash bilgimle sizin betiği hatalarını düzelterek yeniden yazdım:) Aşağıda bir kaç önerimi sıraladım:

1. Değişkenleri her zaman çift tırnak içine alın.
2. Değişkenleri {} içinde ifare edin.
3. [ yerine [[ kullanın.
4. echo yerine printf kullanın.
5. root yetkilerini gerekli olmadığı yerde kullanmayın.
6. if döngülerinde then ifadesinden sonra ; kullanın.


#!/bin/bash

tarih=$(date)
log_file="/var/log/startupSettings/removedLogs"
log_lampp="/var/log/startupSettings/lamppLogs"
trash_dir="/home/mahmut/.local/share/Trash/files/"
mapfile -t dizinler < <(find "${trash_dir}" -mindepth 1 -maxdepth 1 -type d -print)
mapfile -t dosyalar < <(find "${trash_dir}" -mindepth 1 -maxdepth 1 -type f -print)
printf -v cizgi "%*s" "80" ""

if [[ "${USER}" == "mahmut" ]] ; then
       printf "%s\n" "${tarih} Kullanıcının 'mahmut' kullanıcısı olduğu doğrulandı." &>> "${log_file}"
       printf '%s\n' "${cizgi// /-}" &>> "${log_file}"
       for dizin in "${dizinler[@]}"; do
              rm -r "${dizin}" && printf "%s\n" "${tarih} ${dizin} silindi." &>> "${log_file}"
              printf '%s\n' "${cizgi// /-}" &>> "${log_file}"
       done
       for dosya in "${dosyalar[@]}"; do
              rm "${dosya}" && printf "%s\n" "${tarih} ${dosya} silindi." &>> "${log_file}"
              printf '%s\n' "${cizgi// /-}" &>> "${log_file}"
       done
       if [[ -f /opt/lampp/lampp ]] ; then
              sudo /opt/lampp/lampp start && printf "%s\n" "LAMPP servisi başlatıldı." &>> "${log_lampp}"
              servis_pid=$(pgrep lampp)
              printf "%s\n" "${tarih} LAMPP süreç ID = ${servis_pid}" &>> "${log_lampp}"
              printf '%s\n' "${cizgi// /-}" &>> "${log_file}"
       else
              printf "%s\n" "${tarih} /opt/lampp/lampp dosyası bulunamadı." &>> "${log_lampp}"
              printf '%s\n' "${cizgi// /-}" &>> "${log_lampp}"
       fi
else
       printf  "%s\n" "${tarih} ${USER} kullanıcısı ile oturum açıldı." &>> "${log_file}"
       printf '%s\n' "${cizgi// /-}" &>> "${log_file}"
fi

Empat

#16
[mention=642349]@if[/mention]

Çok teşekkürler. Süper olmuş betik.  :)

Bu önerilerinizin nedenlerini de söyleyebilir misiniz?

Öğreneceklerimi, nedenleriyle öğrenirsem, ezberlemiş değil öğrenmiş olurum. Sizi yormadan bu bilgilere sahip olmayı çok isterdim. Fakat bildiğiniz üzere Bash script dilinde ciddi derecede Türkçe kaynak sıkıntısı var. Sizin yazdığınız script'te kullanılan her şeyi açıklayabilecek bir Türkçe kaynağa rastlamadım şu ana kadar. Bash ile ilgili onlarca .pdf döküman okudum. Hepsinde anlatılan konular benim yazdığım betik düzeyinde. Ne kadar back-end ve front-end Web geliştiriciliğine çok ilgim olsa da Bash vazgeçemediğim ve kendimi ilerletecek imkan bulamadığım bir dil. İçimde kalan bir ukte.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

if

[mention=642576]@Empat[/mention],

Rica ederim. Elimden geldiğince açıklayayım.

Alıntı Yap
Enclosing characters in single quotes (''') preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
[1]

Alıntı Yap
Enclosing characters in double quotes ('"') preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\', and, when history expansion is enabled, '!'. When the shell is in POSIX mode (see Bash POSIX Mode), the '!' has no special meaning within double quotes, even when history expansion is enabled. The characters '$' and '`' retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: '$', '`', '"', '\', or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an '!' appearing in double quotes is escaped using a backslash. The backslash preceding the '!' is not removed.

The special parameters '*' and '@' have special meaning when in double quotes (see Shell Parameter Expansion).
[2]

Alıntılama, BASH'in değişkenler, girdiler, diziler vs. üzerinde nasıl işlem yaptığını değiştirdiği için önemlidir. İki tür alıntılama vardır; zayıf ve kuvvetli. Tek tırnak kuvvetli alıntılama iken çift tırnak zayıf alıntılamadır.

İlk alıntı şunu söylüyor: Tek tırnak içindeki her bir karakterin lafzî değeri ne ise korunur.
İkinci alıntı şunu söylüyor: Çift tırnak içindeki her bir karakterin lafzî değeri ne ise korunur; $, `, \ ve ! hariç.
Basit bir örnek ile ikisi arasındaki farkı görelim:

> myvalue="adem"
> echo '$myvalue'
> $myvalue
> echo "$myvalue"
> adem

Gördüğünüz gibi tek tırnak içine alıp değişkeni echo komutuna verdiğimizde bize tek tırnak içinde ne yazıyorsa onu veriyor. Halbuki bize değişkenin değer lazımdı. Çift tırnak bize istediğimizi verdi.

Bir başka örnek; bir dizi tanımlayıp bu dizinin içerisinde kaç tane eleman olduğunu yazdıralım:

> myarray=(bakın yaklaşıyor yaklaşmakta olan)
> echo '${#myarray[@]}'
> ${#myarray[@]}
> echo "${#myarray[@]}"
> 4


Diğerlerine vaktim olunca devam edeyim.

[1] https://www.gnu.org/software/bash/manual/bash.html#Single-Quotes
[2] https://www.gnu.org/software/bash/manual/bash.html#Double-Quotes

Empat

[mention=642700]@if[/mention]

Bilginin bir kelimesi bile çok değerlidir. Çok teşekkürler.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

nebula

#19
Efenim, medya cihazları ile 'ciddi ilişkisi' olan medya oynatıcıları tenzih ederim.
Önüne atılan playlist dosyasının içeriğindeki dosya yollarını ayıklar ve gerçekten öyle bir dosya varsa hepsini yeni oluşturacağı mulo isimli bir klasöre kopyalayarak toplar.
$bash simsar playlist.pls usulü parametrelerden hoşlanır.
Ben medya oynatıcıdan playlist hazırlayıp telefona dosyalarıyla birlikte aktarabilmek için kullanıyorum.

#!/bin/bash
#Playlist Simsarı
urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
mkdir mulo 2>/dev/null

while IFS='' read -r line || [[ -n $line ]]; do
bb=$(urldecode $(echo $line | grep -o "/.*/.*"))
test -f "$bb" && cp "$bb" ./mulo/

done < "$1"


...
Kendi kendimizle yarışmadayız, gülüm.
Ya ölü yıldızlara hayatı götüreceğiz,
Ya dünyamıza inecek ölüm. -N.H.R.-

mhmtkrktr

Alıntı Yap1. Değişkenleri her zaman çift tırnak içine alın.

Duruma göre bunun yapılmaması gereken istisnalar da olabiliyor. örn;
D='a b c'; xyz() { echo $1; echo $2; echo $3;}; xyz $D
D='a b c'; xyz() { echo $1; echo $2; echo $3;}; xyz "$D"

Eğer janjanlı olsun diye (for shift) ile daha alangirli betik yazılmayacaksa, mümkün oldukça "" içine alınmalı denilebilir.

firataltintas

Merhabalar,

csh shell e geçtiğimde 'unknown variable modifier' hatası alıyorum. Bu hatayı almamak yada düzeltmek için ne yapmam gerekiyor ?
Bunu düzeltmem gerekiyor çünkü bu hatadan ötürü çoklu shell ve ek programın kurulmasını gerektiren başka bir programı kuramıyorum.

Teşekkür ederim

Kolay gelsin, iyi çalışmalar