我在用着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