相关疑难解决方法(0)

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

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

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

我遇到了如下问题:

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

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

shell bash shell-script quoting whitespace

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

为什么不带引号的带空格的参数扩展在双括号“[[”内起作用,而在单括号“[”内不起作用?

我对使用单括号或双括号感到困惑。看看这段代码:

dir="/home/mazimi/VirtualBox VMs"

if [[ -d ${dir} ]]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

尽管字符串包含空格,但它工作得很好。但是当我将其更改为单括号时:

dir="/home/mazimi/VirtualBox VMs"

if [ -d ${dir} ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它说:

./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
Run Code Online (Sandbox Code Playgroud)

当我将其更改为:

dir="/home/mazimi/VirtualBox VMs"

if [ -d "${dir}" ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它工作正常。有人可以解释发生了什么吗?什么时候应该在变量周围分配双引号,"${var}"以防止空格引起的问题?

bash ksh quoting test

106
推荐指数
3
解决办法
4万
查看次数

为什么 [ -n ] false 不像 [ -n "" ]?

我的问题是关于这段代码产生的返回值:

if [ -n ]; then echo "true"; else echo "false"; fi
Run Code Online (Sandbox Code Playgroud)

这打印true.

它的补充测试[ -z ]还使用打印true

if [ -z ]; then echo "true"; else  echo "false"; fi
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,为什么[ -n ]测试假设根本没有通过的字符串值,作为非空?

下面的代码打印false. 这是预期的,因为传递的字符串值为空且长度为零。

if [ -z ]; then echo "true"; else  echo "false"; fi
Run Code Online (Sandbox Code Playgroud)

bash

21
推荐指数
3
解决办法
1733
查看次数

为什么即使变量为空, test -n 也会返回 true?我究竟做错了什么?

根据test(1)手册页:

       -n STRING
              the length of STRING is nonzero
Run Code Online (Sandbox Code Playgroud)

所以我预计这会运行良好:

       -n STRING
              the length of STRING is nonzero
Run Code Online (Sandbox Code Playgroud)

我在实际案例中使用了这个逻辑,脚本如下:

[ -n ${var} ] && echo "var is not empty"
Run Code Online (Sandbox Code Playgroud)

这里重要的是,当我运行它时,我收到以下消息:

DEBUG: in-loop peopkg:
DEBUG: in-loop wc -c: 0
DEBUG: in-loop test -n: true
DEBUG: wc -c: 0
DEBUG: pdir: a/alsa-firmware
Error: alsa-utils: doesn't exist in local repos
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义。DEBUG: pdir: a/alsa-firmware表明循环始终在第一次迭代时退出。仅当 glob 模式 a/alsa* 与某些内容匹配并且 peopkg 的长度非零时才会发生这种情况。

PS:我正在努力兼容 POSIX。

shell posix test variable-substitution variable

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