试图逃避引号

试图逃避引号

我尝试了多种方法在脚本中打印这一行:

alias myname='export PATH="/path/to/bin:$PATH"'

他们都有不同的问题。

我最后一次尝试(记住!)是:

printf '%s' '%s\n' 'alias myname=' ''\'"export PATH=\"/path/to/bin:$PATH\"" \'''  >> ~/.bashrc

但它不起作用,它多次打印 PATH 目录并在前面alias myname%sn

(我更喜欢使用 printf)

答案1

如果我正确理解了这个问题,那么您正在尝试添加以下行

alias myname='export PATH="/path/to/bin:$PATH"'

到你的~/.bashrc文件

明显的类型echo会失败,因为 $PATH 在错误的时间扩展。

相反,我们需要进行一些引用混合:

echo "alias myname='export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc

现在你说,出于某种原因,你想使用printf.所以我们可以做类似的事情:

printf "%s\n" "alias myname='export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc

如果要将 的两侧视为=单独的字符串:

printf "%s=%s\n" "alias myname" "'export PATH=\"/path/to/bin:\$PATH\"'" >> ~/.bashrc

等等。

printf仅采用一个格式参数,然后是一个值列表)。

答案2

有两个简单的解决方案。一个是使用这里的文档而不是引号。使用此处文档的引用形式(其中该<<EOF部分包含引号字符)可以关闭此处文档内的变量和命令替换。

cat <<\EOF >>~/.bashrc
alias myname='export PATH="/path/to/bin:$PATH"'
EOF

另一种是在要打印的字符串周围使用单引号。您可以通过使用'\''— 结束单引号文字、追加文字单引号并开始新的单引号文字,有效地转义单引号文字中的单引号。

echo 'alias myname='\''export PATH="/path/to/bin:$PATH"'\'''

(您可以优化掉最终的空字符串文字''。)

在某些 shell 上,echo命令不会按字面打印其参数,这就是为什么打印字符串的可靠方法是使用printf

printf '%s\n' 'alias myname='\''export PATH="/path/to/bin:$PATH"'\'''

在这种特定情况下,echo它也可以工作,因为它执行的唯一扩展涉及反斜杠和前导-.

相关内容