マップされたドライブのディレクトリ内のファイルセットを解析しようとしています。ただし、サブディレクトリパスの空白が原因であるように見える問題を解決できないようです。どんな助けでも大変感謝します!ありがとうございます。
#!/bin/bash
FILES=/home/user/.gvfs/analysis\$\ on\ server.university.edu/users/username/m/BED_files/*
#FILES=/home/user/Desktop #this works
for f in "${FILES}"
do
echo $f
done
答え1
引用符も使用している場合は、ワイルドカードを変数の一部として使用することはできません。 @jasonwryanが提案した配列変数構文は、ループが実行されるのではなく、配列が初期化されたときにディレクトリの内容を確認します。
#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'
for f in "$DIR"/*
do
echo "$f"
done
変数にワイルドカードを定義する必要がある場合は、別の変数に入れてください。
#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'
FILES='*.txt'
for f in "$DIR"/$FILES
do
echo "$f"
done
答え2
最後のサブディレクトリまで権限があることを確認すると、@jasonwryanの答えが機能します。
答え3
デフォルトのPOSIXシェルで配列拡張結果を使用するには、$IFS
ファイル名の生成に注意する必要があります。引用符なしで変数を安全に使用できますが、これは通常最も簡単な方法ではありません。
シェルは何よりも一緒に動作するように設計されています。議論- したがって、パラメータ配列を使用することをお勧めします。
set -- "${FILES%/*}"/*
ただし、globの結果を確認する必要があります。 POSIXシェルでglobを解析できない場合でも、繰り返し可能な引数のままです。これもfor var in glob*
同様です。結果をテストしないと、実際にファイルを使用しているかどうかはわかりません。だから...
for f do [ -e "$f" ] || [ -L "$f" ] && printf %s\\n "$f"; done
次のようにarg配列の項目を繰り返すことができますfor arg do ...;done
。ループ内で"$1"
"$2
「などでアドレスを指定することも、"$@"
いずれかを使用してグローバルにアドレスを指定することもできます。"$*"
ループが完了すると、配列は設定されたままになります。
最後に注目すべき点は、前述したように、ファイル名の生成はシェルの設定可能な機能であることです。を使用して無効にするset -f
か、を使用して有効にすることができますset +f
。さらに、検索中のディレクトリに一致するファイル名がある場合にのみ機能します。それ以外の場合は、未解決のグロブを再インポートします。グローバルマッチングには、ディレクトリに対する検索および実行権限も必要です。したがって、グローバル一致を確認できない場合は、ファイル名の生成を有効にしてパス権限を確認し、ファイルが最初に存在することを確認できます。