或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world,它被视为两个单独的文件hello和world.\[*?,它们会被一些文本替换,这实际上是文件的名称。'(或双引号"),在那之后事情变得很奇怪。\分隔符)。这是怎么回事,我该如何解决?
我一直看到引用此链接的答案明确指出“不要解析ls!” 这让我感到困扰有几个原因:
似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。
该链接中所述的问题似乎也引发了不想找到解决方案的愿望。
从第一段:
...当你要求
[ls]一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls.
无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。
事实是,大多数ls实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …Run Code Online (Sandbox Code Playgroud) 这篇文章实际上包含两个单独的问题,但我认为将它们组合在一起会提供更多背景信息。我已经通过关于变量的引号解决了这个问题,但我不太明白变量扩展的含义。所以我的第一个问题是:
我的问题的第二部分涉及以下术语:
以上是什么意思,它们如何影响变量扩展?原始问题的答案提到以下内容:
将没有引号(在列表上下文中)视为 split+glob 运算符。
好像 echo $test 是 echo glob(split("$test"))。
我找不到直接解决的概念,任何答案通配符和分裂,而是使用这些术语直接在回答其他问题,像这样的最近一个。
shell shell-script terminology environment-variables quoting