26 Ağustos 2019 Pazartesi

readarray komutu

Giriş
Genellikle bir komutun çıktısını bir satır dizisi olarak okumak için kullanılır.

Neden Lazım
Örnek
Elimizde şöyle bir bash döngüsü olsun
for i in ${usbs[@]}; do
  echo $i
done
bash komut çıktısındanki boşlukları hesaba katarak her kelimeyi teker teker verir. readarray komutu ile tüm satırı okumak mümkün.

-t seçeneği
Sondaki newline karakterini siler.

Örnek
Dosyadaki tüm satırları okumak için şöyle yaparız. readAllLines() gibidir.
readarray -t dirs < subdirs2search.txt
find "${dirs[@]}" ...
Örnek
Bir komutun çıktısını okumak için şöyle yaparız. arr isimli değişkene okur.
$ str='25 results [22 valid, 2 invalid, 1 undefined]'

$ readarray -t arr < <( grep -E -o '[0-9]+' <<<"$str" )
Daha sonra göstermek için şöyle yaparız.
$ printf 'value: %s\n' "${arr[@]}"
value: 25
value: 22
value: 2
value: 1
Örnek
Şöyle yaparız
readarray -t usbs < <(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb)
Komutun çıktısı olarak usbs değişkeni şu değeri alır
usbs=(
'sdb   usb    Kingston DataTraveler 2.0'
'sdc   usb    Kingston DT 101 G2'
)
Örnek
Bir komutun çıktısını okumak için şöyle yaparız
#!/bin/bash
readarray -t array< <(sed 's/"//g; s/  *//g; s/,/"/; s/,//g; s/"/,/' "$1")
for element in "${array[@]}";do
    echo "|ELEMENT|$element|"
done
Array içindeki double quote,space karakterlerini silmek için şöyle yaparız.
#!/bin/bash
readarray -t array< "$1"
array=( "${array[@]// /}" ) space sil
array=( "${array[@]//\"/}" ) double quote sil
array=( "${array[@]/,/\"}" )
array=( "${array[@]//,/}" )
array=( "${array[@]/\"/,}" )

for element in "${array[@]}"; do
    echo "|ELEMENT|$element|"
done

Hiç yorum yok:

Yorum Gönder