私はパス名の空白の処理に関するほとんどの質問を読んだが、私の場合、その質問は見つかりませんでした。一部変数のパス名です。
find
2 つの基本パスが指定されている場合は必須です。たとえば、次のようになります。
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
など。