Bashスクリプトの基本を理解するのに問題があります。これが私が今まで持っているものです:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
私が望むのは、ループ.txt
内のすべてのファイルを一覧表示して、そのファイルで何かをすることを可能にすることです。for
ただし、スペースmy directory
とアスタリスクは*.txt
互いにうまく機能しません。変数名に二重引用符を使用したり、使用しないで中かっこを使用したり、使用しなかったりしてみましたが、まだすべての.txt
ファイルを印刷することはできません。
これは非常に基本的なことですが、疲れすぎてまっすぐに考えることができないので、まだ難しいです。
私は何が間違っていましたか?
私のファイルにスペースやアスタリスクがない場合は、上記のスクリプトを正常に適用できました。機能するには、二重引用符と中括弧を使用または使用せずに試みる必要がありました。しかし、空白とアスタリスクの両方があると、すべてが混乱します。
ベストアンサー1
引用符の中には*
ファイルのリストには展開されません。これらのワイルドカードを正常に使用するには、外部引用符を使用する必要があります。
ワイルドカードが拡張されても、式は"${FILES}"
ファイルリストではなく単一の文字列を生成します。
1つの可能なアプローチは次のとおりです。
#!/bin/bash
DIR="/home/john/my directory/"
for f in "$DIR"/*.txt
do
echo "${f}"
done
上記では、スペースやその他の難しい文字を含むファイル名が正しく処理されます。
より進化したアプローチでは、bash配列を使用できます。
#!/bin/bash
FILES=("/home/john/my directory/"*.txt)
for f in "${FILES[@]}"
do
echo "${f}"
done
この場合、FILES
ファイル名の配列です。周囲に括弧を定義して配列にします。*
引用符の外にあることに注意してください。この構成は"${FILES[@]}"
特別なケースです。各文字列はファイル名の1つである文字列のリストに展開されます。スペースやその他の難しい文字を含むファイル名は正しく処理されます。