我在简单的 Bash 脚本中收到“意外标记‘$#’’附近的语法错误”

我在简单的 Bash 脚本中收到“意外标记‘$#’’附近的语法错误”

我在用着Debian 10(Buster),我在一个简单的 Bash 脚本中遇到错误。它所做的只是检查是否传入了一个参数,如果是一个文件,则仅回显该文件:

#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
        echo "$1"
fi

exit 1

我收到此错误:

line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'

我已经尝试了 周围的引号(“、'、无引号)的每种组合$#,并且我总是使用我使用的引号类型得到这些错误消息的变体。我无法弄清楚它在寻找什么。

答案1

这里有两个问题。首先,简单的[内置函数不能包含&&.如果要组合多个条件,则需要多个[

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

其次,您不能在 周围使用单引号,$#因为它需要扩展。您的版本,正在'$#' -eq 1细绳 $#到数字 1。

如果你使用 bash 的关键字,整个事情就会简单得多[[

if [[  "$#" -eq 1  &&  -f "$1"  ]]; then

答案2

[是一个命令,所以问题实际上是您尝试使用多个条件的方式。你要这个:

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

答案3

尽管其他答案解释了如何修复脚本,但我想知道该错误在技术上是什么。我认为 bash 允许命令中的单词不加引号且不转义的唯一有效语法(是在定义函数时。因此,bash 看到(并立即认为它必须是名为 的函数的定义[,但随后您跟着'$#'bash 只期望),所以这就是您收到语法错误的原因。如果它不是一个函数定义,那么谁知道它的含义是什么。(除此之外之后的任何其他内容)都会引发相同的语法错误:

$ echo ( foo )
bash: syntax error near unexpected token `foo'

如果删除后面(不符合函数定义语法的内容,您将得到:

$ [ ( ) ( -f "$1" )

最终定义了函数[

$ [
bash: -f: command not found

相关内容