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

同样的问题。

我在这里缺少什么?

附言。尝试这个:

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"

答案1

问题是您没有引用传递给 的扩展echo

不引用扩展会调用将结果字符串字段拆分为空格上的单词(假设默认值为$IFS),并且最重要的是,在每个单词上生成文件名(通配符)。

其中一个单词是.*,这将扩展到当前目录中的所有隐藏名称。

反而:

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

或者甚至更好,

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

这将输出

ModPagespeedLoadFromFileRuleMatch disallow .*

你也有同样的问题echo $bar

也可以看看:

相关内容