相关疑难解决方法(0)

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

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

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

我遇到了如下问题:

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

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

shell bash shell-script quoting whitespace

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

什么时候需要双引号?

过去的旧建议是对任何涉及 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 bash zsh shell-script quoting

147
推荐指数
1
解决办法
6万
查看次数

为什么这个 bash 条件检查适用于 [[ -n .. ]] 而不是 [ -n .. ]?

我有一个无法检测零长度字符串的脚本,该脚本[ -n $value ]在 bash 条件表达式中使用,即

#!/usr/bin/env bash

value=""
if [ -n $value ]
then
    echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)

结果

值不为零

如果我使用[[ -n $value ]]它有效,即

#!/usr/bin/env bash

value=""
if [[ -n $value ]]
then
    echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)

using[[不会产生预期的输出。从手册页:

   [[ expression ]]
      Return a status of 0 or 1 depending on the evaluation of the conditional expression expression.  Expressions are composed of the pri?
      maries described below under CONDITIONAL EXPRESSIONS.  Word splitting …
Run Code Online (Sandbox Code Playgroud)

bash test

9
推荐指数
2
解决办法
1749
查看次数

测试 -n 给出意外结果

我知道test -n <expression>如果表达式的计算结果为大于 0 的字符串长度,则返回 false。为什么会发生以下情况?

Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo
Run Code Online (Sandbox Code Playgroud)

重击 4.x

我的期望是,既然test -n $undeclared_variable应该评估 false,那么 Foo 不应该被回应。如果我使用[[ ]]而不是测试,它会按预期工作。

shell bash string quoting test

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

标签 统计

bash ×4

quoting ×3

shell ×3

shell-script ×2

test ×2

string ×1

whitespace ×1

zsh ×1