Bashスクリプトエラーです。文字列パスにスペースとワイルドカードが含まれています。

Bashスクリプトエラーです。文字列パスにスペースとワイルドカードが含まれています。

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つである文字列のリストに展開されます。スペースやその他の難しい文字を含むファイル名は正しく処理されます。

答え2

John1024に示すように配列を使用する方が合理的ですが、ここでは分割+glob演算子(引用符なしのスカラー変数)を使用することもできます。

演算子のglob部分のみが必要なので、無効にする必要があります。分ける部分:

#! /bin/sh -
# that also works in any sh, so you don't even need to have or use bash

file_pattern="/home/john/my directory/*.txt"
# all uppercase variables should be reserved for environment variables

IFS='' # disable splitting

for f in $file_pattern # here we're not quoting the variable so
                       # we're invoking the split+glob operator.
do
  printf '%s\n' "$f" # avoid the non-reliable, non-portable "echo"
done

答え3

あなたができることは、ワイルドカードを引用符の外に置くことです。
次のようになります。
for a in "files with space"*".txt"
do
process
done
ワイルドカード自体が空白に拡張されている場合、1行に1つのファイルアプローチを使用する必要はありません。たとえば、ls -l を使用してリストファイルに従い、bash read を使用して各ファイルをインポートします。

答え4

ファイルセットを処理する場合は、ファイル名にスペースやその他の風景コードを含めることができることを考慮して、処理を開始する前に次のようにfor loop設定find commandしますIFS bash env variable

IFS=$(echo -en "\n\b")

関連情報