在 bash(或其他 shell)脚本中,空格数在哪些情况下很重要?

Wei*_*hou 16 shell shell-script

有人告诉我,空格在bash或其他 shell 脚本中很重要,除非我知道自己在做什么,否则我不应该改变空格的存在。“改变存在”是指在两个非空格字符之间插入一个空格或删除两个非空格字符之间的空格,例如更改var="$val"var ="$val"或反之亦然。我想问一下

是否存在在 shell 脚本中使用单个空格或使用多个连续空格会产生影响的情况?.

(当然,在引号中插入/删除空格会有所不同,例如从echo "a b"to更改为,echo "a b"反之亦然。我正在寻找除这个简单示例之外的示例。)

我遇到过这个问题,但那个问题是关于在两个非空格字符之间添加和删除空格的,我知道很多例子表明它会有所作为。

任何帮助,将不胜感激。如果可能,包括更多种类的贝壳。

rua*_*akh 23

这可能是作弊,但这个:

rm foo\ bar         # "delete the file named 'foo bar'"
Run Code Online (Sandbox Code Playgroud)

与此不同:

rm foo\  bar        # "delete the files named 'foo ' and 'bar'"
Run Code Online (Sandbox Code Playgroud)

即使空格不在引号中。;-)

更令人困惑的是:

rm \
    foo          # "delete the file named 'foo'"
Run Code Online (Sandbox Code Playgroud)

与此不同:

rm \ 
    foo          # "delete the file named ' ', then run the command 'foo'"
Run Code Online (Sandbox Code Playgroud)

尽管它们看起来一模一样!


cas*_*cas 21

在引号之外,shell 使用空格(空格、制表符、换行符、回车符等)作为单词/标记分隔符。这意味着:

  • 没有被空格分隔的东西被认为是一个“词”。
  • 由一个或多个空白字符分隔的事物被认为是两个(或多个)单词。

每个“事物”之间的空白字符的实际数量并不重要,只要至少有一个即可。

  • @Worse_Username 空格不必适合内存。我刚刚在具有 8GB RAM 和 20GB 交换空间的机器上创建了一个 48GB 的​​脚本。它运行得很好。处理所有这些空白确实需要 3 分钟,但最终它成功地运行了一个 `echo` 命令,在命令和参数之间有那么多空白。 (9认同)
  • Bash 还将表单提要和垂直选项卡视为空白。 (2认同)

nxn*_*nev 13

如果我们不谈论空格字符 ( U+0020),而是谈论任何空白字符 ( U+0020, \n, \t, 等),那么我会想到一种特殊情况:Here-Documents。

此代码(使用空格):

cat <<- 'EOF'
<space><space>foo
EOF
Run Code Online (Sandbox Code Playgroud)

将打印:

  foo
Run Code Online (Sandbox Code Playgroud)

但是这段代码(使用标签):

cat <<- 'EOF'
<tab><tab>foo
EOF
Run Code Online (Sandbox Code Playgroud)

将打印:

foo
Run Code Online (Sandbox Code Playgroud)

那是因为(如 POSIX 所述):

如果重定向运算符是<<-,则所有前导 <tab> 字符都应从输入行和包含尾随定界符的行中删除。