何时使用续行符,何时不使用?

何时使用续行符,何时不使用?

我一直在阅读“The Linux command line book”,并且遇到了这个行继续字符,我很困惑为什么我们将它与这个 find 命令一起使用:

find playground \
    \( \
        -type f \
        -not -perm 0600 \
        -exec chmod 0600 {} \; \
    \) \
    -or \
    \(
        other options...
    \)

为什么我们不将它与 if 语句一起使用:

if [ $x -eq 5 ]; then 
    echo "x equals 5."
else
    echo "x does not equal 5."
fi

答案1

简单的答案是,因为前者需要它,而后者不需要。

find命令是一个单身的简单的 shell 命令,只需要一些不同的参数,并且有自己的结构。这些参数对 shell 来说没有意义,因此它不知道(和 之间存在逻辑连接)。整个命令可以写在一行上,只是更难阅读。

如果没有行延续,find将使用默认的打印操作运行playground,然后 shell 会尝试运行不带参数的命令(或者,如果您要从 中删除转义,则运行子 shell 中的(命令):-type(

find playground
    \(
        -type f 
        ...

另一方面,if复合语句是 shell 语法的一部分,并且 shell 知道需要哪些部分。在 the 之后then必须有一个命令,最后是一个elseor fi。整个结构也可以写在一行上,但是我们需要在else和之前添加分号fi。 (同样echo foo; echo bar需要将分号或换行符视为两个命令。)

答案2

这是一个特别复杂的示例,因为其中一些\是您所说的“行继续”,但其他一些是为了保护字符,因此 shell 不会解释它们,而是将它们传递给find.具体来说,\(\)和 的\;存在是为了让 shell 不会解释转义字符并将它们按原样传递给find。其余的,\不是紧接在非空格字符之前的是行继续信号。

一般来说,如果你想破坏一个命令,你需要\ 除非你打破其中之一“列表终止符”人物。因此,如果您在其中之一之后进行剪切,则不需要\

; & && || | |& ;; 

例如,echo foo && echo bar可以写为:

echo foo &&
echo bar

不需要\。或者,同样的事情也可以写成:

echo \
foo \
&&
echo \
bar

\请注意我如何在既不是命令结尾也不是列表终止符的地方使用when cut。

如果您在其他地方剪切命令,则需要\.您不需要显示示例\中的if ... then ... else ...,因为在那里您没有剪切命令。每个命令都在自己的行上,这很好。\如果你想打破一个,你只需要单身的命令到多行。

正如 @paul_pedant 在评论中正确指出的那样,如果使用单引号来转义以下内容,则可以使命令更加清晰find

find playground \
    '(' \
        -type f \
        -not -perm 0600 \
        -exec chmod 0600 {} ';' \
    ')' \
    -or \
    '('
        other options...
    ')'

相关内容