或者,有关强大的文件名处理和在 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
可以省略 内部的双引号[[ ... ]]
,但不能省略内部 …
例如,$PATH
和$HOME
当我输入时,echo $PATH
它返回 my $PATH
,但我想回显这个词$PATH
而不是实际变量代表的内容,echo "$PATH"
也不起作用。
有时候,我看到shell脚本使用所有的引用一些文字,这些不同的方式:"..."
,'...'
,$'...'
,和$"..."
。为什么有这么多不同类型的引用被使用?
他们的行为是否有所不同或影响了我在他们内部可以做的事情?
我正在尝试获取某些程序的输出并将它们分配给变量。我正在使用反引号来做到这一点,但如有必要,我可以切换到不同的方法。我注意到的是,我经常没有在变量中得到预期的输出。下面是一个简单的案例。我的实际例子更复杂。无论我在反引号中运行的程序的输出是什么,我都希望它在变量中。那可能吗?
test=`echo [asdf]`
Run Code Online (Sandbox Code Playgroud)
如果我echo $test
只显示一个。