如果单引号和双引号都已使用,如何用引号引起来?

如果单引号和双引号都已使用,如何用引号引起来?

我不记得有时使用的确切命令和技巧来解决大部分工作,因此我尝试将它们记录到文件中以供将来参考。我通常所做的只是将整个命令放入 echo 中并将其快速附加到文件中。

这一直有效,但是第一次出现以下情况,我无法按照上面的说明进行操作。

成功记录

$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt

被困在这里了

$ echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt

上面给出了一个明显的错误,因为引号没有正确关闭(下降到第二个命令 propmt (PS2我猜?)以完成命令,即在我的情况下), sed 命令正在使用>_单引号( ) sed 表达式中使用'双引号 ( ) 进行替换。"

在这种情况下我将如何包含完整的命令?

答案1

您可以完全避免使用此处的文档进行引用。请注意,在单/双引号中设置标签(如下面示例中的“EOF”)会禁用文本中的变量和命令评估。

cat <<"EOF" >>~/globalLog.txt
cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2
EOF

答案2

您有多种选择,每种选择在不同情况下都很方便。

  1. 将整个字符串作为一个双引号,并转义内部的文字双引号(如果只有一个这样的出现,则很容易阅读,但最终可能会得到一个尖桩篱栅):

    echo "cat file2.txt  | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  2. 对字符串的不同部分使用不同的引号:

    echo "cat file2.txt  | sed 's/"'"'"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  3. 使用echo处理多个参数的能力。这适用于只有一个单词包含有问题的字符,因为结果通常在每个参数之间有一个空格,所以它不适用于您的字符串。替代示例:

    echo 'foo"' "'bar"
    

    印刷

    foo" 'bar
    
  4. 使用多个echo -n语句 (or printf %s) 后跟echowithout -n

    echo -n "cat file2.txt  | sed '" >> ~/globalLog.txt
    echo -n 's/"' >> ~/globalLog.txt
    echo "//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  5. 根本不要使用引号,但转义所有特殊字符:

    echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\  >> ~/globalLog.txt
    

注意不可能在单引号字符串中转义单引号

如果有疑问,使用更多报价™

然而,就您而言,您似乎在执行命令之前记录了该命令。已经有一个非常好的解决方案了将命令作为文本使用

答案3

有一种简单、系统且符合 POSIX 标准的报价方式任何细绳。你只需要记住两条规则:

  1. 用反斜杠引用撇号(单引号),如下所示:\'
  2. 通过用撇号括住撇号来引用除撇号之外的所有内容,如下所示:'printf "foo\n"'

为了说明如何一起使用这些规则,don't可以像这样系统地引用这个词:'don'\''t'

您通常可以找到一种更易读的方式来引用字符串,但是当事情变得复杂时,这是获得所需引用的可靠方式。

问题中字符串的引用形式是:

$ echo 'cat file2.txt  | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt

答案4

只是

$ cat >> ~/globalLog.txt
<now type your command>
echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 "
<hit ctrl-d>

相关内容