2016-03-23 26 views
1

Aynı listeyi kullanarak birden çok döngü komutuna sahip bir komut dosyası var. Bu şuna benzer: Uygulama adında bir alan olmadığındanBash döngü komutu boşlukları içeren listeden geç

# List of applications 
read -r -d '' Applications << EndOfList 
/Applications/App.app 
/Applications/App2.app 
/Applications/App3.app 
/Applications/Another App.app 
EndOfList 

for file in $Applications 
do 
    if [ -e "$file" ]; then 
     echo ""$file" found" 
    fi; 
done 

exit 1 

Bu listede dördüncü uygulamanın dışında iyi çalışıyor görünüyor. Ben hata ayıklama modunda komut dosyasını çalıştırın, bu çıkışı:

+ read -r -d '' Applications 
+ for file in '$Applications' 
+ '[' -e /Applications/App.app ']' 
+ for file in '$Applications' 
+ '[' -e /Applications/App2.app ']' 
+ for file in '$Applications' 
+ '[' -e /Applications/App3.app ']' 
+ for file in '$Applications' 
+ '[' -e /Applications/Another ']' 
+ for file in '$Applications' 
+ '[' -e App.app ']' 
+ exit 1 

bunu ve birden başka yollar alıntı, ters eğik çizgi kaçan denedim ama işe alamadı.

cevap

1

You okurken \n olarak IFS kurmak ve satırbaşıyla ayrılmış tüm girdileri tutmak için basit bir değişken yerine BASH dizi kullanmalısınız:

#!/bin/bash 

IFS=$'\n' read -r -d '' -a Applications <<'EndOfList' 
/Applications/App.app 
/Applications/App2.app 
/Applications/App3.app 
/Applications/Another App.app 
EndOfList 

for file in "${Applications[@]}" 
do 
    if [[ -e "$file" ]]; then 
     echo "$file found" 
    fi; 
done 

Not: BASH 4+ sürümü varsa sonra mapfile kullanın:

mapfile -t Applications <<'EndOfList' 
/Applications/App.app 
/Applications/App2.app 
/Applications/App3.app 
/Applications/Another App.app 
EndOfList 
+1

Evet! Bu gerçekten gitmek için bir yoldur. Teşekkürler! Bu konuda daha fazla bilgi buldum [here] (http://mindspill.net/computing/linux-notes/using-the-bash-ifs-variable-to-make-for-loops-split-with- boşluk olmayan-karakter /) – Matter

0

Neden uygulama listesini doğrudan dizinden almak için bir liste kullanmalısınız? Gelecekte yeni uygulama eklemeniz gerekirse, komut dosyasını güncellemeniz gerekir. Ben bir dizin Uygulamalar oluşturduk ve komut dosyanızda 4 dosyaları dokundu:

belki bu dir dosyayı almak için bir fikir olabilir

#!/bin/bash 

# List of applications 


for file in Applications/*.app 
do 
     echo "file[$file]" 
    if [ -e "$file" ]; then 
     echo ""$file" found" 
    fi; 
done 

exit 1 

çıkış

+0

Benim komut bir uygulama yüklü olup olmadığını kontrol etmek için kullanılır. Listedeki uygulamaları belirtiyorum, böylece listeden öğe ekleyip çıkarmam benim için kolay. Görünüşüne göre, komut dosyanız Uygulama dizinindeki tüm uygulamaları yankılamaktadır. İlk betik ayrıca/user/Applications dizininde de kontrol eder, fakat bu problemi bıraktım çünkü tek problemim isimdeki boşluk. – Matter