Tırnak işaretleri "sözcük bölünmesini" önler. Yani: değişkenleri boşluk karakterlerinde birden çok öğeye ayırmak (veya boşluklarda, sekmelerde ve yeni satırlarda varsayılan $IFSkabuk değişkeninin değerinde tanımlandığı gibi daha kesin olmak gerekirse ).
Örneğin,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Burada howmanykaç tane konum parametresinin verildiğini bize bildiren fonksiyonu tanımlıyoruz . Gördüğünüz gibi, değişkene iki öğe aktarılır ve tırnak işaretleri ile değişken içindeki metin bir birim olarak kabul edilir.
Bilginin doğru bir şekilde iletilmesi için bu önemlidir. Örneğin, değişken dosya yolu içeriyorsa ve dosya adı yolun herhangi bir yerinde boşluk içeriyorsa, çalıştırmaya çalıştığınız komut başarısız olabilir veya yanlış sonuçlar verebilir. $varDeğişkenle bir dosya touch $varoluşturmaya çalışsaydık , iki dosya oluşturacaktı, touch "$var"sadece bir tane.
Aynı şey senin için de geçerli [ "$currentoutput" != "$lastoutput" ]. Bu özel test iki karakter dizisi üzerinde bir karşılaştırma yapar. Test çalıştırıldığında, [komutun bir metin dizesi, !=operatör ve başka bir metin dizesi olmak üzere 3 bağımsız değişkeni görmesi gerekir . Çift tırnak tutmak kelime bölünmesini önler ve [komut tam olarak bu 3 argümanı görür. Şimdi değişkenler tırnak içine alınmazsa ne olur?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
Burada, kelime bölme oluşur ve bunun yerine [iki dizeleri görür hellove worldbunu takiben !=diğer iki dizeleri ardından hi world. Kilit nokta, çift tırnak işaretleri olmadan, değişkenlerin içeriğinin bir tam öğe yerine ayrı birimler olarak anlaşılmasıdır.
Komut ikamesi atamak, aşağıdaki gibi çift tırnak işareti gerektirmez
var=$( df )
burada dfkomutun çıktısını kaydedersiniz var. Ancak, $(...)çıktının ayrı öğeler olarak ele alınmasını istemiyorsanız, değişkenleri her zaman ikiye katlamak ve ikame komutunu değiştirmek iyi bir alışkanlıktır .
Yan notta,
while [ true ]
bölüm olabilir
while true
[argümanlarını değerlendiren bir komuttur ve [ whatever ]içinde ne olursa olsun her zaman doğrudur. Buna karşılık, her zaman başarı çıkış durumunu döndüren while truekomutu kullanır true(ve tam olarak whiledöngü gereklidir). Aradaki fark biraz daha fazla netlik ve daha az test yapılmasıdır. Alternatif olarak, kullanabilirsiniz :yerinetrue
echo "" date and TimeKısmen çift tırnak işaretleri muhtemelen kaldırılabilir. Yalnızca boş bir dize ve çıktıya fazladan boşluk eklerler. İstenirse, onları orada tutmaktan çekinmeyin, ancak bu durumda belirli bir fonksiyonel değer yoktur.
lsusb >> test.log
Bu bölüm muhtemelen değiştirilebilir echo "$currentoutput" >> test.log. lsusbZaten içeri girdikten sonra tekrar koşmak için hiçbir sebep yok currentoutput=$(lsusb). Sondaki satırsonlarının
çıktıda korunması gerektiği durumlarda, bir komutun birden çok kez çalıştırılmasının değeri görülebilir, ancak lsusbbuna gerek yoktur. Ne kadar az harici komut çağırırsanız o kadar iyidir, çünkü yerleşik olmayan bir komuta her çağrı CPU, bellek kullanımı ve yürütme süresinde maliyete neden olur (komutlar muhtemelen bellekten önceden yüklenmiş olsa bile).
Ayrıca bakınız:
while [ true ]sonsuz bir döngü oluşturduğunu, ancak belki de düşündüğünüz nedenden dolayı olmadığını unutmayın;while [ false ]Ayrıca sonsuz bir döngü üretir, çünkü tek bir argümanla,[ ... ]bu argüman boş olmayan bir dize ise başarılı olur.while trueaslında (her zaman başarılı olur) adlı bir komutu çalıştırırtrue.