相关疑难解决方法(0)

为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。

我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。

我遇到了如下问题:

  • 我有一个包含空格的文件名hello world,它被视为两个单独的文件helloworld.
  • 我有一个带有两个连续空格的输入行,它们在输入中缩小为一个。
  • 前导和尾随空格从输入行中消失。
  • 有时,当输入包含其中一个字符时\[*?,它们会被一些文本替换,这实际上是文件的名称。
  • 输入中有一个撇号'(或双引号"),在那之后事情变得很奇怪。
  • 输入中有一个反斜杠(或者:我使用的是 Cygwin 并且我的一些文件名具有 Windows 样式的\分隔符)。

这是怎么回事,我该如何解决?

shell bash shell-script quoting whitespace

341
推荐指数
3
解决办法
32万
查看次数

我们如何运行存储在变量中的命令?

$ ls -l /tmp/test/my\ dir/
total 0
Run Code Online (Sandbox Code Playgroud)

我想知道为什么以下运行上述命令的方法失败或成功?

$ abc='ls -l "/tmp/test/my dir"'

$ $abc
ls: cannot access '"/tmp/test/my': No such file or directory
ls: cannot access 'dir"': No such file or directory

$ "$abc"
bash: ls -l "/tmp/test/my dir": No such file or directory

$ bash -c $abc
'my dir'

$ bash -c "$abc"
total 0

$ eval $abc
total 0

$ eval "$abc"
total 0
Run Code Online (Sandbox Code Playgroud)

shell bash quoting variable

104
推荐指数
2
解决办法
13万
查看次数

bash:空格安全的程序使用 find into select

鉴于这些文件名:

$ ls -1
file
file name
otherfile
Run Code Online (Sandbox Code Playgroud)

bash 本身对于嵌入的空白完全没问题:

$ for file in *; do echo "$file"; done
file
file name
otherfile
$ select file in *; do echo "$file"; done
1) file
2) file name
3) otherfile
#?
Run Code Online (Sandbox Code Playgroud)

但是,有时我可能不想处理每个文件,甚至不希望使用严格的 in $PWD,这是find进来的地方。名义上也处理空格:

$ find -type f -name file\*
./file
./file name
./directory/file
./directory/file name
Run Code Online (Sandbox Code Playgroud)

我正在尝试编造这个scriptlet的 whispace-safe 版本,它将获取输出find并将其呈现到select

$ select file in $(find -type f -name file); do echo $file; break; …
Run Code Online (Sandbox Code Playgroud)

bash text-processing whitespace select

12
推荐指数
3
解决办法
2188
查看次数