或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world
,它被视为两个单独的文件hello
和world
.\[*?
,它们会被一些文本替换,这实际上是文件的名称。'
(或双引号"
),在那之后事情变得很奇怪。\
分隔符)。这是怎么回事,我该如何解决?
过去的旧建议是对任何涉及 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
可以省略 内部的双引号[[ ... ]]
,但不能省略内部 …
我想我可能忽略了关于 shell 的一个相对基本的观点。默认情况下,ls命令的输出用换行符分隔输出,但 shell 将输出显示在一行上。
任何人都可以向我解释这一点吗?我一直假设输出只是由空格分隔,但现在我看到输出由换行符分隔,我希望输出显示在单独的行上。
例子:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
Run Code Online (Sandbox Code Playgroud)
od显示输出由换行符分隔:
cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000 t e x t 1 \n t e x t 2 \n t e x t
0000020 3 \n
0000022
Run Code Online (Sandbox Code Playgroud)
如果存在换行符,那么为什么输出不显示为:
text1
text2
text3
Run Code Online (Sandbox Code Playgroud)