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)
您有多种选择,每种选择都可以在不同情况下方便使用。
将整个字符串双引号作为一个,并转义内部的文字双引号(如果您只有一个这样的事件,则易于阅读,但最终可能会出现一个栅栏):
echo "cat file2.txt | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/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)Useecho
处理多个参数的能力。如果只有一个单词包含有问题的字符,这适用,因为结果通常在每个参数之间有一个空格,因此它不适用于您的字符串。替代示例:
echo 'foo"' "'bar"
Run Code Online (Sandbox Code Playgroud)
印刷
foo" 'bar
Run Code Online (Sandbox Code Playgroud)使用多个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)根本不要使用引号,而是转义所有特殊字符:
echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\ >> ~/globalLog.txt
Run Code Online (Sandbox Code Playgroud)请注意,不可能在单引号 string 中转义单引号。
如果有疑问,请使用更多报价™。
但是,在您的情况下,您似乎在执行命令之前记录了该命令。已经有一个非常好的解决方案来处理 text 形式的命令。
有一种简单、系统且符合 POSIX 的方法来引用任何字符串。你只需要记住两条规则:
\'
'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)