パス名からメタ文字をいつエスケープするのかわかりません。

パス名からメタ文字をいつエスケープするのかわかりません。

どのような状況でパス名のメタ文字をエスケープする必要があるのか​​混乱しています。次の例を考えてみましょう。

私は次の作業ディレクトリにあります。

$ echo $PWD
/home/helpermethod/foo[b]ar/foo/bar

今私はすべてを後ろからはがしたいですfoo[b]ar。これを行うためにパラメータ置換を使用しています:/home/helpermethod/foo[b]ar

$ path=$PWD
$ basename=foo[b]ar
$ stripped_path=${path%$basename/*}/$basename

basename文字列を正しくエスケープする必要があるため、これは機能しないようです。

$ basename=foo\[b\]ar
$ stripped_path=${path%$basename/*}/$basename

stripped_pathわかりました、今私が探していたものを見つけました。

$ echo "$stripped_path"
/home/helpermethod/foo[b]ar

しかし、今これが有効なディレクトリかどうかをテストすると

$ [[ -d $stripped_path ]]

このtestコマンドは常にfalseを返します(つまり、戻り値!= 0)。ここで問題は何ですか?エスケープを解除する必要がありますかstripped_path

ベストアンサー1

stripped_path=${path%"$basename"/*}/$basename

リテラル文字列の一致には、パターン一致の代わりに二重引用符を使用します。変数を参照する必要がある状況の1つです。別の状況は次のとおりです。

echo $PWD

上記の内容は次のとおりです。

echo "$PWD"

または、より良い方法は次のとおりです。

printf '%s\n' "$PWD"

または

pwd

おすすめ記事