Giriş
İmzası şöyle.
- 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.
Örnek
Tek satır döngülerde şöyle yaparız.
Şöyle yaparız. Ancak bence do ve komut aynı satırda olduğu için okuması zor.
Şöyle yaparız. do komutu ayrı bir satırda
Örnek - break
For döngüsünü öğrenirken sanırım en başta break; yapmayı öğrenmek gerekiyor. Şöyle yaparız.
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
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
glob'layarak dönmek için şöyle yaparız.
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.
Bash pitfalls sayfasında find komutunun çıktısını döngü ile dolaşmak yanlış deniyor. Şu kod hatalı
Eğer for döngüsüne üzerinde yürüyeceği bir dizi vermezsek "positional parameters" üzerinde dolaşır. Şöyle yaparız.
İ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.
A 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.
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ık1. {...} ş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 - globglob'layarak dönmek için şöyle yaparız.
for globFile in lib/*.sh; do
[ -f "$globFile" ] || continue
source "$globFile"
done
Örnek - globdata 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ış globBash 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