Daha Eksiksiz Bir Uygulama
Uzun bir aradan sonra çalışmalarımıza kaldığımız yerden devam edeceğiz. sys_info_page programı. Bir sonraki eklememiz, programa aşağıdaki gibi birkaç komut satırı seçeneği ekleyecektir:
● Çıktı dosyası. Programın çıktısını içerecek bir dosya için bir isim belirtmek için bir seçenek ekleyeceğiz. Ya olarak belirtilecektir -f dosya or --dosya dosya.
● Etkileşimli mod. Bu seçenek, kullanıcıdan bir çıktı dosya adı isteyecek ve belirtilen dosyanın zaten var olup olmadığını belirleyecektir. Varsa, mevcut dosyanın üzerine yazılmadan önce kullanıcıya sorulur. Bu seçenek ya tarafından belirtilecektir -i or --interaktif.
● Yardım. Ya da -h or --yardım et programın bilgilendirici bir kullanım mesajı vermesine neden olacak şekilde belirtilebilir.
Komut satırı işlemeyi uygulamak için gereken kod:
kullanım () {
echo "$PROGNAME: kullanım: $PROGNAME [-f dosya | -i]" dönüş
}
# işlem komut satırı seçenekleri etkileşimli=
kullanım () {
echo "$PROGNAME: kullanım: $PROGNAME [-f dosya | -i]" dönüş
}
# işlem komut satırı seçenekleri etkileşimli=
dosya adı=
while [[ -n $1 ]]; 1 dolarlık davayı yap
-f | --dosya)
çalışma
dosya adı=$1
;;
dosya adı=
while [[ -n $1 ]]; 1 dolarlık davayı yap
-f | --dosya)
-i | --interaktif) etkileşimli=1
;;
-h | --help) kullanım çıkışı
;;
*) kullanım >&2
çıkış 1
;;
-i | --interaktif) etkileşimli=1
;;
-h | --help) kullanım çıkışı
;;
*) kullanım >&2
çıkış 1
;;
esac
vardiya yapıldı
esac
vardiya yapıldı

İlk olarak, adında bir kabuk işlevi ekliyoruz. kullanım yardım seçeneği çağrıldığında veya bilinmeyen bir seçenek denendiğinde bir mesaj görüntülemek için.
Ardından, işleme döngüsüne başlıyoruz. Bu döngü, konumsal parametre
$1 boş değil. Döngünün sonunda, döngünün sonunda sona ereceğinden emin olmak için konum parametrelerini ilerletmek için bir shift komutumuz var.
Döngü içinde bir dava Desteklenen seçeneklerden herhangi biriyle eşleşip eşleşmediğini görmek için geçerli konum parametresini inceleyen ifade. Desteklenen bir parametre bulunursa, buna göre hareket edilir. Bilinmeyen bir seçim bulunursa, kullanım mesajı görüntülenir ve komut dosyası bir hata ile sonlanır.
The -f parametre ilginç bir şekilde işlenir. Tespit edildiğinde, ek bir neden olur çalışma konumsal parametreyi ilerleten meydana gelmesi $1 için sağlanan dosya adı bağımsız değişkenine -f seçeneği.
Daha sonra etkileşimli modu uygulamak için kodu ekliyoruz:
# etkileşimli mod
if [[ -n $etkileşimli ]]; o zaman doğru iken; yapmak
read -p "Çıktı dosyasının adını girin: " dosya adı if [[ -e $dosyaadı ]]; sonra
read -p "'$filename' var. Üzerine yazılsın mı? [y/n/q] > " case $REPLY in
Y|y) ara
# etkileşimli mod
if [[ -n $etkileşimli ]]; o zaman doğru iken; yapmak
read -p "Çıktı dosyasının adını girin: " dosya adı if [[ -e $dosyaadı ]]; sonra
read -p "'$filename' var. Üzerine yazılsın mı? [y/n/q] > " case $REPLY in
Y|y) ara
;;
Q|q) echo "Program sonlandırıldı." çıkış
;;
*) devam et
;;
esac
elif [[ -z $dosyaadı ]]; o zaman devam et
başka
kırılma
fi
yapılmış
fi
;;
Q|q) echo "Program sonlandırıldı." çıkış
;;
*) devam et
;;
esac
elif [[ -z $dosyaadı ]]; o zaman devam et
başka
kırılma
fi
yapılmış
fi
Eğer interaktif değişken boş değilse, dosya adı istemini ve ardından mevcut dosya işleme kodunu içeren sonsuz bir döngü başlatılır. İstenen çıktı dosyası zaten mevcutsa, kullanıcıdan üzerine yazması, başka bir dosya adı seçmesi veya programdan çıkması istenir. Kullanıcı mevcut bir dosyanın üzerine yazmayı seçerse, bir kırılma döngüyü sonlandırmak için yürütülür. Nasıl olduğuna dikkat edin dava deyimi yalnızca kullanıcının üzerine yazmayı veya çıkmayı seçip seçmediğini algılar. Başka bir seçim, döngünün devam etmesine neden olur ve kullanıcıyı tekrar ister.
Çıktı dosya adı özelliğini uygulamak için, birazdan netleşecek nedenlerden dolayı, önce mevcut sayfa yazma kodunu bir kabuk işlevine dönüştürmeliyiz:
write_html_page () { kedi <<- _EOF_
$TITLE
$TITLE
$TIMESTAMP
$(rapor_çalışma süresi)
$(report_disk_space)
$(report_home_space)
_EOF_ dönüş
}
# çıktı html sayfası
if [[ -n $dosyaadı ]]; sonra
write_html_page () { kedi <<- _EOF_
$TITLE
$TITLE
$TIMESTAMP
$(rapor_çalışma süresi)
$(report_disk_space)
$(report_home_space)
_EOF_ dönüş
}
# çıktı html sayfası
if [[ -n $dosyaadı ]]; sonra
$dosyaadı && [[ -f $dosyaadı ]]; sonra write_html_page > $dosyaadı
başka
echo "$PROGNAME: '$filename' dosyası yazılamıyor" >&2 çıkış 1
başka
write_html_page
fi
$dosyaadı && [[ -f $dosyaadı ]]; sonra write_html_page > $dosyaadı
başka
echo "$PROGNAME: '$filename' dosyası yazılamıyor" >&2 çıkış 1
başka
write_html_page
fi
Mantığını işleyen kod -f seçeneği, yukarıda gösterilen listenin sonunda görünür. İçinde, bir dosya adının varlığını test ederiz ve eğer bulunursa, dosyanın gerçekten yazılabilir olup olmadığını görmek için bir test yapılır. Bunu yapmak için bir dokunma gerçekleştirilir, ardından ortaya çıkan dosyanın normal bir dosya olup olmadığını belirlemek için bir test yapılır. Bu iki test, geçersiz bir yol adının girildiği durumlarla ilgilenir (dokunma başarısız olacak) ve dosya zaten varsa, bunun normal bir dosya olduğunu.
Gördüğümüz gibi write_html_page sayfanın gerçek üretimini gerçekleştirmek için işlev çağrılır. Çıktısı ya standart çıktıya yönlendirilir (eğer değişken dosya adı boş) veya belirtilen dosyaya yönlendirildi.
 
 
 Dökümanlar
 Dökümanlar