Bashの置換はディレクトリ構造を示しています

Bashの置換はディレクトリ構造を示しています

ファイルに書き込む前に、変数のバックティックをエスケープしたいと思います。残念ながら、これらの行の一部には不快な項目があります。

(foo拡張を避けたいです。foo = "ModPagespeedLoadFromFileRuleMatch disallow .*"を文字通りインポートして置換を実行したいのですが、拡張を望ましくありません。これはファイルに配置するように指示するだけです。)

foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
echo ${foo//\\/\\\\}

これは私に次のことを与えます:

ModPagespeedLoadFromFileRuleMatch disallow . .. .bash_history .bashrc .cloud-locale-test.skip .filemin .gnupg .local .mysql_history .profile .rnd .rpmdb .ssh

私もこれを試しました:

foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' );
echo $bar

foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo $bar

同じ質問。

私がここで何を見逃しているのでしょうか?

PS。この試み:

foo='ModPagespeedLoadFromFileRuleMatch disallow .*' 
echo "$foo" 

それからこれを試してみてください(パイプするときにこれが起こらないことを願っています)。

foo='ModPagespeedLoadFromFileRuleMatch disallow .*' 
echo "$foo" | 

2番目の例のパイプに注意してください。

答え:

foo="ModPagespeedLoadFromFileRuleMatch\ disallow .*"
echo "${foo//\\/\\\\}"

foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' )
echo "$bar"

foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo "$bar"

ベストアンサー1

問題は、渡した拡張子への参照がないことですecho

結果の文字列フィールドを空白の単語(デフォルトと仮定$IFS)に分割し、最も重要なことは、各単語にファイル名(ワイルドカード)を生成するために引用符解除拡張が呼び出されます。

そのうちの1つは、.*これが現在のディレクトリのすべての隠された名前に拡張されることです。

代わりに:

foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
echo "${foo//\\/\\\\}"

またはより良い、

foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
printf '%s\n' "${foo//\\/\\\\}"

これは出力されます

ModPagespeedLoadFromFileRuleMatch disallow .*

あなたも同じ問題がありますecho $bar

また見なさい:

おすすめ記事