16 Mayıs 2020 Cumartesi

bash kodlama - for döngüsü

Giriş
İmzası şöyle.
for name [ [in [words …] ] ; ] do commands; done
- Döngüde genellikle do komutu for komutu ile aynı satıra konulur.
- Veya do komutu kendi başına bir satıra konulur.
- Eğer do ile komutu aynı satıra koyarsak bence okuması daha zor kodlar ortaya çıkıyor.

do/Komut/done Hangi Satıra Konulmalı
Komutları kendi başına bir satıra koymak bence daha iyi. Açıklaması şöyle.
command list is a sequence of one or more simple commands separated or terminated by a newline or ; (semicolon). Furthermore, reserved words like do and done are normally preceded by a newline or ; ... In turn each time the command list following do is executed.
Örnek
Tek satır döngülerde şöyle yaparız.
$ for i in $(jot 2); do echo $i; done
Örnek
Şöyle yaparız. Ancak bence do ve komut aynı satırda olduğu için okuması zor.
for f in *
  do cmd1
  cmd2
done
Örnek
Şöyle yaparız. do komutu ayrı bir satırda
$ for i in $(jot 2)
> do
>     echo $i
> done
Break Nasıl Yapılır
Örnek - break
For döngüsünü öğrenirken sanırım en başta break; yapmayı öğrenmek gerekiyor. Şöyle yaparız.
for i in {1..10}; do
  sleep 10
  OUTPUT=$(systemctl is-active etcd)
  if [[ $OUTPUT == active ]]; then
    echo "The result is successful"
    break
  else
    echo "The result is unsuccessful"
  fi
done
Döngüde Kullanılabilen Aralık
1. {...} şeklinde sayı aralığı verilebilir. Aralık için değişken kullanılamaz
2. Değişken'in Değeri Kullanılabilir
3. seq komutuyla sayı aralığı üretilebilir.
4. uygulama çıktısı kullanılabilir
Örnek - sayı aralığı
Şöyle yaparız
for i in {0800..9999}; do
  for j in {001..032}; do
    wget http://site.com/"$i-$j".jpg
  done
done
Örnek - harf aralığı
Şöyle yaparız.
for d in {A..Z}; do 
  mkdir "$d"; 
  cd "$d"; 
done
Örnek - değişken
Şöyle yaparız.
for((i=1;i<=$rows;i++)); do
    echo "$RANDOM"
done
Örnek - array
Şöyle yaparız.
#! /bin/bash
servers=( 192.xxx.xxx.2 192.xxx.xxx.3
          192.xxx.xxx.4 192.xxx.xxx.5
          192.xxx.xxx.6 192.xxx.xxx.7
)

for server in "${servers[@]}" ; do
    echo "$server"
done
Örnek - uygulama çıktısı
Şöyle yaparız.
for node in `ls ~/sagLogs/`; do  
  foo &  
done
Örnek - seq
Şöyle yaparız.
for i in `seq 1 2000`; do
  mv file.$i.pdb file.pdb.$i
done
Örnek - seq
Şöyle yaparız.
for n in `seq 1 $count`
  do var=${numbers[0]}
done
Örnek - glob
glob'layarak dönmek için şöyle yaparız.
for globFile in lib/*.sh; do
  [ -f "$globFile" ] || continue
  source "$globFile"
done
Örnek - glob
data dizinin altında train ve test isimli iki dizin olsun. glob'layarak bu dizinlerdeki dosyaları saymak için şöyle yaparız. ${#files[@]} ile array'in uzunluğu alınır.
for dir in /data/*; do
  files=( "$dir"/*/* ); printf "%s\t%s\n" "$dir:" "${#files[@]}";
done
Çıktı olarak şunu alırız.
/data/test:     5432
/data/train:    1234
Örnek - yanlış glob
Bash pitfalls sayfasında find komutunun çıktısını döngü ile dolaşmak yanlış deniyor. Şu kod hatalı
for entry in `find . -type f`; do
  echo $entry 
done
Doğrusu find ve -print0'ı beraber kullanmak. Şöyle yaparız.
while IFS= read -r -d '' entry; do
  printf 'Processing: %s\n' "$entry"
done < <(find . -type f -print0 | sort -z)
Örnek - $@
Eğer for döngüsüne üzerinde yürüyeceği bir dizi vermezsek "positional parameters" üzerinde dolaşır. Şöyle yaparız.
#!/bin/bash
for var;
do
  echo "$var"
done
Çıktı olarak şunu alırız.
$ ./test a b c
a
b
c
Aslında şu kod ile aynı şeydir.
for i in "$@"; do
  something with "$i"
done

Hiç yorum yok:

Yorum Gönder