我想在将变量写入文件之前转义变量中的引号。不幸的是,其中一些行有一些不愉快的项目。
(我想避免 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" |
注意第二个例子中的管道
回答:
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"
问题是您没有引用传递给
echo
.不引用扩展会调用将结果字符串字段拆分为空格上的单词(假设默认值为
$IFS
),并且至关重要的是,在每个单词上生成文件名(通配符)。其中一个词是
.*
, 这将扩展到当前目录中的所有隐藏名称。反而:
甚至更好,
这将输出
你有同样的问题
echo $bar
。也可以看看: