IF deyimi kullanırken bir kabuk komutunu birden çok satıra nasıl bölebilirim?


384

Komut bir ififadenin parçası olduğunda, bir komutu kabuktaki birden çok satıra nasıl bölebilirim ?

Bu çalışıyor:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi

Bu işe yaramaz:

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi

Tüm komutun yerine yerine şunu elde ederim:

./script.sh: line 73: --forward-agent: command not found

Daha da önemlisi, gelecekte bu ve benzeri sorunları anlamama yardımcı olacak Bash anlayışımdan eksik olan ne?


2
Hata nedir? Sonra $ if ! cp -n log/server1.log \ > .; then echo no copy; fibir satırsonu ile hatasız yürütmek mümkün\
Sefil Değişken

15
Terminal ters eğik çizgilerinden sonra boşluklarınız var \ mı? Görmek oldukça zor. Bunu yaparsanız, düzenleyicinizin sondaki boşlukları kaldırmasını veya daha görünür olmasını sağlayıp sağlayamayacağınızı görmek isteyebilirsiniz.
msw

10
Evet, terminal ters eğik çizgilerden sonraki boşluklardı. Tamamen. Teşekkür ederim.
Dmitry Minkovsky

Ve evet, üzgünüm, "hata" (beklenmedik sonuç) gönderdi olmalı! Benim hatam! Şimdi düzenleniyor.
Dmitry Minkovsky

Anlayışınız neydi? Bu da sorunun bir parçası değil.
hakre

Yanıtlar:


566

Ters eğik çizgiden sonra ve satır sonundan önce boşluk (boşluklar veya sekme karakterleri) varsa satır devamı başarısız olur. Böyle bir boşluk olmadan, örneğin benim için iyi çalışıyor:

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed

Yorumlardan bazı ayrıntılar tanıtıldı: kabuktaki hat devam ters eğik çizgisi gerçekten özel bir durum değil; bir ters eğik çizginin hemen takip eden karakteri "alıntıladığı", genel kuralın bir örneğidir. Bu durumda, bir sonraki karakter yeni bir satırdır ve önlenen özel tedavi komutu sonlandırır. Normalde, komutun tam anlamıyla dahil edilen bir karakter rüzgarı sarılır; bunun yerine ters eğik çizgili bir satırsonu tamamen silinir. Ancak aksi halde, mekanizma aynıdır. Ve ters eğik çizgi sadece hemen takip eden karakteri tırnak içine alır; bu karakter bir boşluk veya sekme ise, tırnak içine alınmış bir boşluk veya sekme alırsınız ve sonraki satırlar tırnaksız kalır.


5
Mark, bilirsin, beyaz boşluklara sahip olmalıydım. Hatayı yalnızca `s. For example, when adding one after the first `` sonra beyaz boşluk eklerken yeniden oluşturabiliyorum ./soundops: line 73: --forward-agent: command not found. Sorunlarım bu hatayı anlamadığım oldu. Boşluğa sahip olmak neden bu hatayla sonuçlanıyor? Boşluk + \n`` '' yi reddeder ve bir komutu sınırlar mı?
Dmitry Minkovsky

83
Yeni satırın önündeki ters eğik çizgi, yeni satırın komutu sonlandırmasını engeller. Ancak "\ n" gibi özel kaçış dizileri sadece ters eğik çizgi ile n arasında hiçbir şey olmadan çalıştığında, ters eğik çizgi yeni satır yalnızca ters eğik çizgi ile yeni satır arasında hiçbir şey olmadan çalışır.
Mark Reed

18
Hahaha vay, elbette bu mantıklı. Hiç böyle görmedim. Göz açıcı, ancak çok basit: sadece kaçan bir yeni satır. Görünmez karakterlerden nefret ediyorum. Eğer hepsi görünür olsaydı bana çok daha mantıklı geliyorlardı. Teşekkür ederim!
Dmitry Minkovsky

7
Çoğu editörde bu görünmez karakterleri görünür yapabilirsiniz.
lucasvc

1
Ters eğik çizgi ve yeni satır, etkin komut satırından silinir, ancak sonraki satırdaki önde gelen boşluklar korunur. Bu nedenle, bir sorun olup olmadığı, boşlukların tek satır komutunda o noktada bir sorun olup olmayacağına bağlıdır.
Mark Reed

52

Windows / WSL / Cygwin vb kullanıcıları için:

Satır uçlarınızın standart Unix satır beslemeleri olduğundan emin olun, yani \n(LF).

Windows satır sonlarını \r\n(CRLF) kullanmak satır sonlarını komut satırı sonunu kesecektir.


Bunun nedeni \, Windows satır sonu olan bir satırın sonunda olması anlamına gelir \ \r \n.
Mark'ın yukarıda açıkladığı gibi:

Ters eğik çizgiden sonra ve satır sonundan önce boşluk varsa, satır devamı başarısız olur.

Buna yalnızca boşluk ( ) veya sekmeler ( \t) değil, satır başı ( \r) da dahildir.


1
Bu, Windows'ta bir komut dosyası oluşturup daha sonra Windows bash'de (örn. Windows düzenleyicisinde MyShellScript.sh'ın oluşturulduğu bash -c MyShellScript.sh) oluşturulurken oluşan sorunu giderir. MyShellScript.sh dosyasını belki de notepad ++ kullanarak UNIX biçiminde kaydetmeniz gerekir.
BSalita
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.