IFS
Normal olarak, kabuk, sağlanan girdi üzerinde sözcük bölme işlemi gerçekleştirir. okumak. Gördüğümüz gibi bu, bir veya daha fazla boşlukla ayrılmış birden çok kelimenin giriş satırında ayrı öğeler haline geldiği ve ayrı değişkenlere şu şekilde atandığı anlamına gelir. okumak. Bu davranış, adlı bir kabuk değişkeni tarafından yapılandırılır. IFS (Dahili Alan Ayırıcı için). varsayılan değeri IFS her biri öğeleri birbirinden ayıracak bir boşluk, bir sekme ve bir yeni satır karakteri içerir.
değerini ayarlayabiliriz IFS giriş alanlarının ayrılmasını kontrol etmek için okumak. Örneğin, / Etc / passwd dosya, iki nokta üst üste karakterini alan ayırıcı olarak kullanan veri satırlarını içerir. değerini değiştirerek IFS tek bir kolona, kullanabiliriz okumak içeriğini girmek için / Etc / passwd ve alanları farklı değişkenlere başarıyla ayırın. İşte tam da bunu yapan bir betikimiz var:
#! / Bin / bash
# read-ifs: alanları bir dosyadan okuyun FILE=/etc/passwd
#! / Bin / bash
# read-ifs: alanları bir dosyadan okuyun FILE=/etc/passwd
read -p "Bir kullanıcı adı girin > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; sonra
IFS=":" kullanıcıyı oku pw uid gid adı ana sayfa kabuk <<< "$file_info" echo "Kullanıcı = '$user'"
echo "UID = '$uid'"
echo "GID = '$gid'" echo "Tam Ad = '$isim'" echo "Ev Yön. = '$ev'" echo "Kabuk = '$Kabuk'"
başka
echo "Böyle bir kullanıcı yok '$user_name'" >&2 çıkış 1
fi
read -p "Bir kullanıcı adı girin > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; sonra
IFS=":" kullanıcıyı oku pw uid gid adı ana sayfa kabuk <<< "$file_info" echo "Kullanıcı = '$user'"
echo "UID = '$uid'"
echo "GID = '$gid'" echo "Tam Ad = '$isim'" echo "Ev Yön. = '$ev'" echo "Kabuk = '$Kabuk'"
başka
echo "Böyle bir kullanıcı yok '$user_name'" >&2 çıkış 1
fi
Bu komut dosyası, kullanıcıdan sistemdeki bir hesabın kullanıcı adını girmesini ister, ardından kullanıcı kaydında bulunan farklı alanları / Etc / passwd dosya. Komut dosyası iki ilginç satır içeriyor. İlk olarak:
file_info=$(grep "^$kullanıcı_adı:" $DOSYA)
Bu satır, bir grep değişkene komut dosya_bilgisi. tarafından kullanılan normal ifade grep kullanıcı adının yalnızca tek bir satırla eşleşmesini sağlar / Etc / passwd dosyası.
İkinci ilginç satır şudur:
IFS=":" kullanıcıyı oku pw uid gid adı ana sayfa kabuğu <<< "$file_info"
Satır üç bölümden oluşur: bir değişken ataması, bir okumak argüman olarak değişken isimleri listesi ve garip bir yeni yeniden yönlendirme operatörü içeren komut. İlk önce değişken atamasına bakacağız.
Kabuk, bir veya daha fazla değişken atamasının bir komuttan hemen önce gerçekleşmesine izin verir. Bu atamalar, aşağıdaki komutun ortamını değiştirir. Görevlendirmenin etkisi geçicidir; sadece komut süresince ortamı değiştirmek. Bizim durumumuzda, değeri IFS iki nokta üst üste karakterine değiştirilir. Alternatif olarak, bunu şu şekilde kodlayabilirdik:
OLD_IFS="$IFS" IFS=":"
kullanıcıyı oku pw uid gid adı ana sayfa kabuğu <<< "$file_info" IFS="$OLD_IFS"
değerini nerede saklıyoruz IFS, yeni bir değer atayın, okumak komutunu verin ve ardından geri yükleyin IFS orijinal değerine. Açıkça, değişken atamasını önüne yerleştirmek
komut, aynı şeyi yapmanın daha kısa bir yoludur.
The << operatör bir gösterir burada dize. Burada dizesi, burada belgesi gibidir, yalnızca daha kısadır, tek bir dizeden oluşur. Örneğimizde, veri satırı
/etc/passwd dosyası, read komutunun standart girdisine beslenir. Kazanabiliriz-
neden bu oldukça eğik yöntemin seçildiği yerine:
echo "$file_info" | IFS=":" kullanıcı pw uid gid adını oku ana kabuk

Eh, bir nedeni var...
Boru okuyamıyorsun
süre okumak komut normalde standart girdiden girdi alır, bunu yapamazsınız:
yankı "foo" | okuman
Bunun işe yaramasını beklerdik ama olmuyor. Komut başarılı gibi görünecek, ancak YANIT değişken her zaman boş olacaktır. Bu neden?
Açıklama, kabuğun boru hatlarını işleme biçimiyle ilgilidir. İçinde darbe (ve diğer mermiler gibi sh), boru hatları oluşturmak altkabuklarda. Bunlar, boru hattında komutu yürütmek için kullanılan kabuğun ve ortamının kopyalarıdır. Yukarıdaki örneğimizde, okumak bir alt kabukta yürütülür.
Unix benzeri sistemlerdeki alt kabuklar, işlemler yürütülürken kullanmaları için ortamın kopyalarını oluşturur. İşlemler bittiğinde ortamın kopyası yok edilir. Bunun anlamı şudur ki bir alt kabuk, ana sürecinin ortamını asla değiştiremez. okumak daha sonra ortamın bir parçası haline gelen değişkenler atar. Yukarıdaki örnekte, okumak değişkene "foo" değerini atar CEVAP VERMEK alt kabuğunun ortamında, ancak komut çıktığında, alt kabuk ve çevresi yok edilir ve atamanın etkisi kaybolur.
Burada dizeleri kullanmak, bu davranışa geçici bir çözüm bulmanın bir yoludur. Başka bir yöntem Bölüm 36'da tartışılmaktadır.
Dökümanlar