我正在使用Debian 10 (Buster) 并且在一个简单的 Bash 脚本中遇到错误。它所做的只是检查是否传入了一个参数,如果它是一个文件,只需回显该文件:
#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
echo "$1"
fi
exit 1
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'
Run Code Online (Sandbox Code Playgroud)
我已经尝试了围绕 的所有引号(“,',无引号)的组合$#,并且我总是使用我使用的引号类型获得这些错误消息的变体。我无法弄清楚它在寻找什么。
ter*_*don 20
这里有两个问题。首先,简单的[内置函数不能包含&&. 如果要组合多个条件,则需要多个[:
if [ "$#" -eq 1 ] && [ -f "$1" ]; then
Run Code Online (Sandbox Code Playgroud)
其次,您不能在 周围使用单引号,$#因为它需要扩展。您的版本'$#' -eq 1是将字符串 $#与数字 1进行比较。
如果你使用 bash 的[[关键字,整个事情就会简单得多:
if [[ "$#" -eq 1 && -f "$1" ]]; then
Run Code Online (Sandbox Code Playgroud)
Fox*_*Fox 11
[是一个命令,所以问题实际上是您尝试使用多个条件的方式。你要这个:
if [ "$#" -eq 1 ] && [ -f "$1" ]; then
Run Code Online (Sandbox Code Playgroud)
JoL*_*JoL 10
尽管其他答案解释了如何修复脚本,但我想知道技术上的错误是什么。我认为 bash 允许命令中的单词不带引号和不转义的唯一有效语法(是定义函数时。所以,bash 看到(并立即认为它必须是一个名为 的函数的定义[,但随后你跟着'$#'bash 只是期待),所以这就是你遇到语法错误的原因。如果它不是一个函数定义,那么谁知道它是什么意思。(除此之外的任何其他内容)都会引发相同的语法错误:
$ echo ( foo )
bash: syntax error near unexpected token `foo'
Run Code Online (Sandbox Code Playgroud)
如果删除(不符合函数定义语法的内容,您将得到:
$ [ ( ) ( -f "$1" )
Run Code Online (Sandbox Code Playgroud)
最终定义了函数[:
$ [
bash: -f: command not found
Run Code Online (Sandbox Code Playgroud)