2016-03-23 21 views
1

同じリストを使用して複数のループコマンドを持つスクリプトがあります。Bashループのコマンドに空白を含むリスト

# 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 

これは、アプリケーション名にスペースがあるため、リストの4番目のアプリケーションを除いて正常に動作しているようです。私はデバッグモードでスクリプトを実行すると、これが出力されます。

+ 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 

私はそれと複数の他の方法を引用し、バックスラッシュでエスケープしようとしましたが、私はそれを動作させることができませんでした。

答えて

1

あなたはIFS\nと設定してください。単純な変数ではなくBASH配列を読み込んで使用してください。

#!/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 

PS:あなたはBASH 4+バージョンを持っている場合は、mapfileを使用します。

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

はい!それは確かに行く方法です。ありがとう!私はこの権利[ここ](http://mindspill.net/computing/linux-notes/using-the-bash-ifs-variable-to-make-for-loops-split-with-html-html-html-html-html-html-html-html-html-html-html-html)に関するいくつかの詳細を見つけました。非空白文字/) – Matter

0

代わりにリストを使用して、アプリファイル名をディレクトリから直接取得する必要があるのはなぜですか? 今後新しいアプリを追加する必要がある場合は、スクリプトを更新する必要があります。

多分これは、ディレクトリからファイルを取得するためのアイデアが考えられます。 私は、ディレクトリのアプリケーションを作成し、スクリプト内の4番目のファイルに触れてきました:

#!/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 

出力

+0

私のスクリプトは、アプリケーションがインストールされているかどうかを確認するために使用されます。私はリストに項目を追加または削除するのが簡単なので、リストにアプリケーションを指定します。見た目は、あなたのスクリプトがApplicationディレクトリ内のすべてのアプリケーションをエコーし​​ています。最初のスクリプトは/ user/Applicationsディレクトリもチェックしますが、私の唯一の問題は名前のスペースなので、その部分を残しました。 – Matter

関連する問題