Bash (veya diğer kabuk) komut dosyalarında boşluk sayısının önemli olduğu bazı durumlar nelerdir?


14

Bana boşlukların bashya da diğer kabuk metinlerinde önemli olduğu söylendi ve ne yaptığımı bilmiyorsam boşlukların varlığını değiştirmemeliydim. "Varoluşu değiştirmek" ile, ya boşluk olmayan iki karakter arasına boşluk eklemek ya da boşluk olmayan iki karakter arasına boşluk var="$val"koymak , örneğin , var ="$val"ya değiştirmek ya da tam tersi demek . Ben sormak istiyorum

Bir kabuk betiğinde tek bir boşluk kullanmanın veya birden çok ardışık boşluk kullanmanın fark yarattığı durumlar var mı? .

(Tabii ki, ekleme / tırnak içinde bir boşluk silmesini değiştirilmesi gibi bir fark yaratıyor echo "a b"için echo "a b"veya tam tersi. Bu basit örnekte dışındaki örnekler için arıyorum.)

Ben bu soruya rastladım ama bu bir boşluk yaratacak birçok örnek biliyorum hangi boşluk olmayan iki karakter arasında boşluk ekleme ve kaldırma ile ilgili.

Herhangi bir yardım mutluluk duyacağız. Mümkünse daha fazla çeşit kabuk ekleyin.

Yanıtlar:


19

Tırnakların dışında, kabuk sözcük / simge ayırıcısı olarak boşluk (boşluklar, sekmeler, satırsonu, satır başı, vb.) Kullanır. Bunun anlamı:

  • Boşluk ile ayrılmayan şeyler bir "kelime" olarak kabul edilir .
  • Bir veya daha fazla boşluk karakteriyle ayrılmış şeyler iki (veya daha fazla) kelime olarak kabul edilir.

Her "şey" arasındaki gerçek boşluk karakterlerinin sayısı, en az bir tane olduğu sürece önemli değildir.


Teşekkür ederim. Ben kendime karşı bir örnek bulamıyorum. Ben sadece emin olmak istiyorum.
17'de Weijun Zhou

2
Bash ayrıca form beslemelerini ve dikey sekmeleri boşluk olarak değerlendirir.
fpmurphy

doğru. Başlangıçta '... newlines, vb' yazdım ve sonra açıkça satır başı eklemek için değiştirdim. yanlışlıkla 'vb.' 'yi düşürdü.
cas

Alan sayısı o kadar fazla olursa, program belleğe sığmazsa ne olur?
Worse_Username

7
@Worse_Username Beyaz alanın belleğe sığması gerekmez. 8GB RAM ve 20GB takas içeren bir makinede 48GB'lık bir komut dosyası oluşturdum. Sadece iyi koştu. Tüm bu boşlukları ezmek 3 dakika sürdü, ama sonunda echokomut ile argüman arasındaki bu boşlukla başarılı bir şekilde komut verdi.
kasperd

23

Bu muhtemelen aldatıyor, ama bu:

rm foo\ bar         # "delete the file named 'foo bar'"

bundan farklı:

rm foo\  bar        # "delete the files named 'foo ' and 'bar'"

alanlarda olsa bile değil tırnak içinde. ;-)

Daha şaşırtıcı bir şekilde, bu:

rm \
    foo          # "delete the file named 'foo'"

bundan farklı:

rm \ 
    foo          # "delete the file named ' ', then run the command 'foo'"

Hatta onlar olsa bakmak özdeş!


Boşluklar tırnak içinde olmasa da, ters eğik çizgi işlevsel olarak alıntı biçimine benzer ve bunu sorunun "önemsiz örneği" ile aynı kategoriye yerleştirirdim. (Yine de ilginç.)
David Z

12

Uzay karakteri (hakkında konuşmak yoksa U+0020), ancak herhangi bir boşluk karakteri ( U+0020, \n, \tİşte-Belgeler: vs.), sonra belirli bir durum aklıma geliyor.

Bu kod (boşluklar kullanarak):

cat <<- 'EOF'
<space><space>foo
EOF

Yazdırılacak:

  foo

Ancak bu kod (sekmeleri kullanarak):

cat <<- 'EOF'
<tab><tab>foo
EOF

Yazdırılacak:

foo

Bunun nedeni ( POSIX'in belirttiği gibi ):

Yeniden yönlendirme operatörü ise <<-, tüm önde gelen <tab> karakterleri giriş satırlarından ve sondaki sınırlayıcıyı içeren satırdan çıkarılmalıdır.


1
Bu ilginç. Burada belgeleri düşündüm ama <<-operatörü bilmiyordum . Çok teşekkür ederim.
17'de Weijun Zhou

burada belgeler kabuk kodu değil, alıntılanmış bir metin biçimidir. kabuk sözcük bölme geçerli değildir.
cas

2

Ayrıca atama ifadeleri yazarken de bir etkisi vardır. Değeri ile FOO=xyzadlandırılmış bir ortam değişkeni yaratacağını söylersem , ama eşitleri boşlukla ayırırsam , arg ile adlandırılmış bir programı çağırdığımı düşünürüm . Belirli sözdizimi söz konusu olduğunda önemli.FOOxyzFOO=xyz


Genellikle FOO=xyzbir iç kabuk değişkeni oluşturur, ancak bir ortam değişkeni oluşturmaz. Buna ihtiyacınız var set -aya da bunun export FOO=xyziçin (yani alt kabuk olmayan alt işlem ortamının bir parçası haline getirmek).
Hauke ​​Laging
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.