相关疑难解决方法(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万
查看次数

`while read -r line || 是什么意思 [[ -n $line ]]` 是什么意思?

不久前我发现了一些从文件中读取输入的代码,我相信来自 Stack Exchange,我能够适应我的需求:

while read -r line || [[ -n "$line" ]]; do
    if [[ $line != "" ]]
    then
        ((x++));
        echo "$x:  $line"
    <then do something with $line>
    fi
done < "$1"
Run Code Online (Sandbox Code Playgroud)

我现在正在检查我的脚本并试图了解它在做什么......我不明白这个语句在做什么:

while read -r line || [[ -n "$line" ]];

我知道 -r 选项表示我们正在将原始文本读入行,但我|| [[ -n "$line" ]]对语句的部分感到困惑。有人可以解释一下这是在做什么吗?

read

8
推荐指数
1
解决办法
3087
查看次数

标签 统计

bash ×2

quoting ×2

shell ×2

read ×1

shell-script ×1

variable ×1

whitespace ×1