我听说printf比echo. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。
过去的旧建议是对任何涉及 a 的表达式加双引号$VARIABLE,至少在希望 shell 将其解释为单个项目的情况下,否则,内容中的任何空格$VARIABLE都会脱离 shell。
但是,我知道在较新版本的 shell 中,不再总是需要双引号(至少出于上述目的)。例如,在bash:
% FOO='bar baz'
% [ $FOO = 'bar baz' ] && echo OK
bash: [: too many arguments
% [[ $FOO = 'bar baz' ]] && echo OK
OK
% touch 'bar baz'
% ls $FOO
ls: cannot access bar: No such file or directory
ls: cannot access baz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在zsh,而另一方面,同样的三个命令成功。因此,基于此实验,似乎在 中bash可以省略 内部的双引号[[ ... ]],但不能省略内部 …
我想在 bash 脚本完成后输出它。
/\_/\
( o.o )
> ^ <
Run Code Online (Sandbox Code Playgroud)
我已尝试以下但所有返回错误。
echo /\\_/\\\n\( o.o \)\n > ^ <
echo \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <
Run Code Online (Sandbox Code Playgroud)
如何转义这些字符以便 bash 将它们呈现为字符串?
我曾经在命令行上交替使用''和""(单引号和双引号),但我最近注意到它'$HOME/some/dir'没有扩展,"$HOME/some/dir"而是。我搜索了一下,发现""允许对特殊字符进行一些保护,同时''允许完全保护。那么还有哪些其他字符受保护''和不受保护""?
编辑:这些差异可能显着的实际情况是什么?
我对这个实验(在 Bash 中)感到困惑:
$ mkdir 'foo\n'
$ find . -print0 | od -c
0000000 . \0 . / f o o \ n \0
0000012
Run Code Online (Sandbox Code Playgroud)
如您所见,“find”正确地用空字符分隔输出,但它将目录名称中的换行符转义为“foo\n”,并带有反斜杠“n”。为什么要这样做?我告诉它“-print0”,它说“这允许包含换行符的文件名......被处理查找输出的程序正确解释。” 转义应该是不必要的,因为“\0”是分隔符,而不是“\n”。
如果我输入:
echo "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
我不知道它的名字,但它提示我输入下一行。你知道这PS2件事。或者,如果您键入echo \并按Enter。
为什么?
嗯,我知道这!是一个特殊变量,您可以使用它来引用您的历史记录。
但一旦我使用这个:
echo "Hello, World"!
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的输出。发生了什么事,为什么不能!在内部使用""?
感谢您的帮助 :)
转义序列与 ASCII 控制字符有常见的配对,例如 Ctrl-C 和 Ctrl-Z 分别与 ETX 和 SUB 配对。
在维基百科控制代码页面上,有最多的配对,但没有引用的参考。
控制字符和键序列配对是标准的一部分吗?
Linux 和其他操作系统的列表在哪里?
是否有手册页列出了这些配对?
它们纯粹是几十年的不成文约定吗?
参考
stty -a列出了一些我在这里找到了有趣的讨论并尝试了给出的解决方案 sed
如何在文件开头插入文本?
它适用于普通文本,但不适用于将文本保存在变量中时。
wolf@linux:~$ cat file.txt
1
2
3
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
将文本 ( <added text>)添加到文件的开头
wolf@linux:~$ sed -i '1s/^/<added text>\n/' file.txt
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
有用!
wolf@linux:~$ cat file.txt
<added text>
1
2
3
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
但是,当我用变量尝试它时,它不再起作用。
wolf@linux:~$ var='Text 1'
wolf@linux:~$ echo $var
Text 1
wolf@linux:~$
wolf@linux:~$ cat file.txt
1
2
3
wolf@linux:~$ sed -i '1s/^/"$var"\n/' file.txt
wolf@linux:~$ cat file.txt
"$var"
1
2
3
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
而不是"$var",我如何调用$varinsed命令的实际值?我使用 GNU sed4.7:
sed (GNU sed) 4.7 Packaged by Debian …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些 python 代码的文件。有一行包含以下内容(包括引号)
'hello "value"'
我想'hello "value"在文件中搜索。注意未封闭的报价。我正在使用带有以下命令的 ripgrep:
rg -F 'hello "value"
上述命令不适用于'hello "value"bash/zsh 中的输入。我想要的只是文字匹配。我已经使用了该标志,F但由于输入字符串中没有关闭引号,它根本不起作用。我还尝试将输入括在单/双引号内,如下所示:
rg -F "'hello "value"" 或者 rg -F ''hello "value"'
上面的方法也行不通。
为什么即使使用F告诉 ripgrep 按原样考虑输入的标志,使用 ripgrep 字面搜索字符串也如此神秘?我如何解决它?
该命令按预期echo Hello World打印Hello World,但echo Hello (World)生成错误syntax error near unexpected token `('。
我知道,支架等(),{},[]是令牌和有特殊的含义,那么你如何在“逃避”这些bash脚本?