如果已经使用了单引号和双引号,如何用引号括起来?

mtk*_*mtk 7 command-line quoting

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

这一直有效,但以下情况是第一次出现,我无法按照上述方式进行操作。

登录成功

$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt
Run Code Online (Sandbox Code Playgroud)

卡在这里

$ echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,我将如何附上完整的命令?

iru*_*var 12

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

cat <<"EOF" >>~/globalLog.txt
cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2
EOF
Run Code Online (Sandbox Code Playgroud)

  • 您可能需要注意围绕“EOF”的双引号的重要性。没有它们,这里的文本会受到变量扩展的影响,这有时很有用。 (2认同)

l0b*_*0b0 6

您有多种选择,每种选择都可以在不同情况下方便使用。

  1. 将整个字符串双引号作为一个,并转义内部的文字双引号(如果您只有一个这样的事件,则易于阅读,但最终可能会出现一个栅栏):

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

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

    echo 'foo"' "'bar"
    
    Run Code Online (Sandbox Code Playgroud)

    印刷

    foo" 'bar
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用多个echo -n语句(或printf %s)后跟一个echo不带-n

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

    echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\  >> ~/globalLog.txt
    
    Run Code Online (Sandbox Code Playgroud)

请注意,不可能在单引号 string 中转义单引号

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

但是,在您的情况下,您似乎在执行命令之前记录了该命令。已经有一个非常好的解决方案来处理 text 形式的命令


aec*_*ley 5

有一种简单、系统且符合 POSIX 的方法来引用任何字符串。你只需要记住两条规则:

  1. 像这样用反斜杠引用撇号(单引号): \'
  2. 通过用撇号包围它来引用除撇号以外的所有内容,如下所示: 'printf "foo\n"'

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

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

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

$ echo 'cat file2.txt  | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt
Run Code Online (Sandbox Code Playgroud)