Justin, quanta'nın cevabı hakkındaki ilk yorumunda sorusunu açıkladı. O read(veya başka bir dinamik yolla) kullanarak bir metin satırında okuyor ve dalga işaretini genişletmek istiyor.
Soru, "Bir değişkenin içeriği üzerinde yaklaşık işareti genişletmesi nasıl yapılır?"
Genel yaklaşım kullanmaktır eval, ancak >değişkente boşluklar ve çıkış yeniden yönlendirmesi ( ) gibi bazı önemli uyarılarla birlikte gelir . Aşağıdakiler benim için çalışıyor gibi görünüyor:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
Aşağıdaki girişlerin her biriyle deneyin:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
açıklama
${mypath//>}Şeritler >sırasında dosyanın bilmeden olabilir karakterleri eval.
eval echo ...Gerçek yaklaşık yorumlaması yaptığı iştir
- Etrafındaki çift tırnak işaretleri
evalboşluklu dosya adlarını desteklemek içindir.
Buna ek olarak, -eokuma seçeneğini ekleyerek UX'i geliştirebilirsiniz :
read -p "Provide the destination directory: " -e DESTINATION
Şimdi kullanıcı tilde yazıp sekmeye bastığında genişleyecektir. Ancak, bu yaklaşım yukarıdaki değerlendirme yaklaşımının yerine geçmez , çünkü genişleme yalnızca kullanıcı sekmeye bastığında gerçekleşir. Eğer sadece ~ / foo yazar ve isabet girerse, tilde kalır.
Ayrıca bakınız:
cd "~/Desktop"bir hata da alırsınız. Tırnak işaretsiz veya değişken olarak (tırnak işaretleri olmadan) saklanmalıdır. Örneğin,a=~/Desktop; cd $a;çalışıyor ancak çalışmıyora="~/Desktop"; cd Desktop;Bkz serverfault.com/questions/417252/…