変数に複数のパスが含まれている場合のパス名のスペースを処理する方法

変数に複数のパスが含まれている場合のパス名のスペースを処理する方法

私はパス名の空白の処理に関するほとんどの質問を読んだが、私の場合、その質問は見つかりませんでした。一部変数のパス名です。

find2 つの基本パスが指定されている場合は必須です。たとえば、次のようになります。

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 

以下で一致するものを探します。両方 folder1そしてfolder2

(参考に、この内容は簡単にはい。この特別なケースでは、2つのフォルダにまたがるパラメータで-path修飾子を使用できることに注意してください。folder*しかし、この質問は複雑さが高く、問題を簡単に解決できない状況を扱います。 )


さて、途中folder2にスペースがあると想像してみてください。次はいいえ働く:

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 

問題は\通常、シェルで空白を表すために使用されますが、変数の内容を二重引用符で囲んでも機能しないことです。しかし一つ各変数へのパス(動作可能)、次のいずれかは機能しません。

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

次のバリエーションも同様です。

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 

その場合、パスのスペースを正しく処理する方法は次のとおりです。一部パスは変数に含まれていますか?

関連質問:スペースがパスとその後続のエントリ(同じ変数内)の間の区切り文字であるか、それに含まれるパスの1つに属するスペースであるかを判断するための信頼できる方法はありますか?

答え1

配列を使用してくださいbash

pa=("/home/user/folder1" "/home/user/fol der2")
find "${pa[@]}" -name '*xy*' ... 

議論する

\目的の効果がないことを確認してください。

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2

定義\では、paエスケープ文字ではなく文字列のリテラル文字になります。個々の文字列のリストが必要な場合は、配列を使用してください。

答え2

配列変数を使用し、配列の各要素にパス値を入力します。これが実際に可能でない場合は、以下を除いて別のアプローチを使用することです。スペースプロジェクト区切り文字として使用してください。

p[0]="hello"
p[1]="happy"
p[2]="world"

echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}"

for p in "${p[@]}"
do
    echo "p=$p."
done

など。

関連情報