👨💻 Shell Script
Önemli Bilgiler
sh
uzantılı dosyalara yazılırlar- Dosyaların ilk satırlarına shebang olarka ifade edilen satır yazılır
- Kodlar derlenmeden önce bu satıra bakılır ve yapısına karar verilir (kaynak)
- Dosyanın ilk satırına shell script olduğunu belli etmesi için
#!/bin/bash
yazılır - Terminal üzerinden
bash <dosya>
olarak çalıştırılabilirler
VsCode Eklentileri
Temel Operatörler
Operatör | Açıklama | ||
---|---|---|---|
- | Son çalışan dizine gitme | ||
~ | Home dizini | ||
<komut>; <komut>; | Birden fazla komut işleme (birbirlerini beklemez) | ||
<komut> & <komut> | Birden fazla komut işleme (sırayla işler) | ||
<komut> && <komut> | 1. komut çalışırsa 2.'yi işleme | ||
` | ` | 1. olmazsa 2. komutu işleme | |
` | ` | 2. komutu ilk komutun çıktısında çalıştırma (pipeline) | |
> | Yönlendirme (yoksa oluşturur) | ||
>> | Eklemeli yönlendirme (üzerine yazmaz, ekler) | ||
!$ | Bir önce kullanılan değişkeni kullanma | ||
!! | Bir önceki komutu kullanma |
Bash Komutu
Komut | Açıklama |
---|---|
bash <dosya> | Dosyadaki komutları terminalde gerçekleştirir |
bash -c "<komut>" | Verilen komutu terminalde gerçekleştirir |
Yazdırma İşlemleri (Echo)
Komut | Açıklama |
---|---|
echo "<metin>" | Ekrana metni olduğu gibi basma |
echo -e "<metin>" | Ekrana metni formatlı basma (\n \t gibi karakterler çalışır) |
echo $<değişken> | Ekrana değişken basma |
echo $(<komut>) | Ekrana komut çıktısını basma |
echo $(<komut>)' metin '$(<komut>) | Ekrana komut çıktısını ve metni basma |
echo "<metin>" > <dosya_yolu> | Verilen metni dosyanın üzerine yazma, yoksa dosyayı oluşturma |
echo "<metin>" >> <dosya_yolu> | Verilen metni dosyaya ekleme |
sudo bash -c echo "<metin>" > <root_dosya> | Root dosyasının üzerine yazma, yoksa dosyayı oluşturma |
<komut> &> /dev/null | Çıktıları gizleme |
>
ile yapılan yönlendirme işlemleriecho
tarafından değilshell
tarafından yapılır. Yetki sorunları olursaecho
'ya değilshell
'e yetki verilmelidir.
<metin>
Ekrana basılacak metin- Örn:
yemreak
- Örn:
<değişken>
Linux değişkenleri (ortam değişkenleri vs.)- Örn:
PYTHONPATH
,HOME
- Örn:
<komut>
Linux komutları- Örn:
pwd
- Örn:
<dosya_yolu>
Metnin yazılacağı dosyanın yolu- Örn:
yemreak.txt
,../yemreak.sh
,~/yemreak.ini
- Örn:
Cat ile Yazdırma İşlemi
Dosyaya EOT gelene kadar yazma
cat << <sonlandırma_metni> >> <dosya_yolu>satır1satır2<sonlandırma_metni>
<sonlandırma_metni>
Bu metin geldiğinde yazma işlemini sonlandırır- Örn:
A
olursaYemreAK
yazıldığında sonlanmaz,A
yazıldığında sonlanır.
- Örn:
<dosya_yolu>
Metnin yazılacağı dosyanın yolu- Örn:
yemreak.txt
,../yemreak.sh
,~/yemreak.ini
- Örn:
Değişkenler
- Değişkenler kod içerisin
$
ön eki ile kullanılır - Değişkenlere atama yapılırken
=
sonrası ve öncesinde boşluk bırakılmaz- Boşluk olursa her metni komut gibi işlemeye çalışır ve hata verir
- Değişkenlerle aritmatik işlemler
let "<işlem>"
komutuyla yapılırlet "myvar = 5"
çalışırken,mayvar = 5
hata verir
file="help"let "file = 'wow'"echo $file
Let komutu hakkında daha fazla bilgi için buraya bakabilirsin.
Kullanıcıdan Girdi (Input) Alma
read varnameecho $varnameread -p 'Username: ' uservar # Girdide yorum göstermeread -sp 'Password: ' passvar # Gizli girdiechoecho Thankyou $uservar we now have your login details
String İşlemleri
${#var} # Var string'inin uzunluğunu hesaplama${var#*.} # .'ya kadar tüm metni siler# String Kıyaslamaif [ $kelime == "yemreak" ]; thenecho "Eşdeğer"fi# String içinde alt stirng arama (cümle'de kelime varsa 1) (2 tane [ olduğuna dikkat)if [[ "$cumle" =~ "$kelime" ]]; thenecho "Bulundu"elseecho "Bulunamadı"fi# Stringdeki i. sıradaki kelimeyi almalet "word = $(echo $WID | awk '{print $1}')" # İlk olanı alma $word1 = ilk kelimelet "word = $(echo $WID | awk '{print $i}')" # i. olanı alma# Boşluklarla ayrılan cümledenki kelimeleri almafor kelime in $cumle; doecho $kelimedone
İf-Else Yapısı
Temel açıklamaya buradan erişebilirsin.
[ $1 ] || { echo "Usage: $0 file1.wma file2.wma"; exit 1; } # 1.parametre yoksa çıkma
For Döngüsü
Temel açıklamaya buradan erişebilirsin.
Terminalde Seçim Yaptırma
Switch - Case Yapısı
while true; doread -p "Do you wish to install this program?" yncase $yn in[Yy]* ) make install; break;;[Nn]* ) exit;;* ) echo "Please answer yes or no.";;esacdone
Select Yapısı
echo "Do you wish to install this program?"select yn in "Yes" "No"; docase $yn inYes ) make install; break;;No ) exit;;esacdone
İç İçe Seçim Yapısı
while true; doread -p "Xammp kurmak ister misin [y/n] " # -n 1 -rcase $REPLY in[Yy]* ) {# İstenen kodlarwhile true; doread -p "Xammp komutları tanımlansın mı (xampp ve mysql) [y/n] " # -n 1 -rcase $REPLY in[Yy]* ) {# İstenen kodlarbreak};;[Nn]* ) break;;esacdonewhile true; doread -p "Wordpress kurmak ister misin [y/n] " # -n 1 -rcase $REPLY in[Yy]* ) {# İstenen kodlarbreak};;[Nn]* ) break;;esacdonebreak};;[Nn]* ) break;;esacdone
Terminalde For Döngüsü (For Loop)
for f in *; doecho "-> $f"done
Her Dizine For Döngüsü
Alt Dizinler Dahil Değil
for D in *; doif [ -d "${D}" ]; thenecho "${D}" # your processing herefidone
for D in *; do [ -d "${D}" ] && my_command; done
for D in */; do my_command; done
Alt Dizinler Dahil
for D in `find . -type d`do//Do whatever you need with Ddone
Fonksiyonlar
dowload_with_name() {var='hello'return $var}
Fonksiyonların Kullanımı
dowload_with_name # Fonksiyonlar isimleri ile kullanılırecho $? # Return değeri '$?' olarak tanımlanır. Hello basar
Temel fonksiyon kaynağı için buraya bakabilirsin.
Parametreler
$1
1. parametre$2
2. parametre$0
Fonksiyonun ismi$@
Tüm parametreler (dizi)
Parametreli Fonksiyonlar
fonksiyon(){arg1=$1 # 1. parametrearg2=$2 # 2. parametreecho "1. $arg1, 2. $arg2"}# Kullanımıfonksiyon arguman1 arguman2 # 1. arguman1, 2. arguman2
Dosya İşlemleri
Kontrol Bayrakları
Kullanım şekli [ <bayrak> <string> ]
[ -f "$1" ] || {echo "$1 dosyadır"}
Bayrak | Açıklama |
---|---|
-f | Dosya kontrolü (File) |
-d | Dizin kontrolü (Directory) |
Dosya Okuma
Kaynak için buraya bakabilirsin.
filepath='img0.jpg' # Dosyanın yolufilestr='' # Okunan verilerin kayıt edileceği değişkenwhile IFS= read line # Dosya sonuna kadar okumadolet "filestr += $line" # Satır satır dosyayı okumadone < "$filepath" # Okunacak dosyanın yolunu verme
Dosyadan URL ile İndirme
prefix='img' # Ön ekext='.jpg' # Dosya uzantısınum=0 # Sayaçwhile IFS= read linedowget -O $prefix$num$ext "$line"let "num += 1"done < "../$file"
Sıkıştırma (Arşivleme) İşlemleri
Dosya sıkıştırma:
filename="dosya yolu"out="Çıktı yolu.zip"zip "$out" "$filename$"zip -R $out "*.c" $ # '.c' ile biten düm dosyaları sıkıştırır (alt dizinlerde de arar /dir1/file.c /dir2/file.c)
Dizin Sıkıştırma:
dirname="dizin_yolu"out="Çıktı yolu.zip" # Boşluk kabul ederzip -r "$out" "$dirname$"