Bash语法错误:意外的文件结尾
请原谅,这是Bash中一个非常简单的脚本。代码如下:Bash语法错误:意外的文件结尾,bash,syntax,Bash,Syntax,请原谅,这是Bash中一个非常简单的脚本。代码如下: #!/bin/bash # june 2011 if [ $# -lt 3 -o $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 运行sh file.sh后: 语法错误:意外的文件结尾 我能够将您的代码剪切并粘贴到一个文件中,并且运行正常。如果你 按如下方式执行,它应该可以工作: 您的“file.sh”: 命令: $ ./f
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
运行sh file.sh后:
语法错误:意外的文件结尾
我能够将您的代码剪切并粘贴到一个文件中,并且运行正常。如果你 按如下方式执行,它应该可以工作: 您的“file.sh”: 命令:
$ ./file.sh arg1 arg2 arg3
请注意,“file.sh”必须是可执行文件:
$ chmod +x file.sh
您可能会在输入时遇到错误b/c(带管道、胡萝卜、,
等等)。您也可以尝试将条件分为两部分:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
或者,由于您使用的是bash
,因此可以使用内置语法:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
最后,您当然可以检查是否给出了3个参数(干净,
保持POSIX外壳兼容性):
我只是把你的例子剪切粘贴成一个文件;它在猛击下运行良好。我看不出有什么问题 为了更好地衡量,您可能希望确保它以换行结束,尽管bash不应该在意。(不管有没有最后的换行符,它都适合我。) 如果不小心在文件中嵌入了控制字符,有时会看到奇怪的错误。由于它是一个简短的脚本,请尝试通过将您的问题粘贴到StackOverflow上,或者简单地重新键入来创建一个新脚本 您使用的是什么版本的bash?(
bash--version
)
祝你好运 我认为file.sh使用CRLF行终止符 跑 然后问题就解决了 您可以通过以下方式在ubuntu中安装dos2unix:
sudo apt-get install dos2unix
关于cygwin,我需要:-
export SHELLOPTS
set -o igncr
在.bash_配置文件中。这样我就不需要运行unix2dos了(我刚刚想到):
- 用分号终止单行函数体
die () { test -n "$@" && echo "$@"; exit 1 }
要让哑巴解析器高兴,请执行以下操作:
die () { test -n "$@" && echo "$@"; exit 1; }
我还通过在
if
子句中使用错误的语法得到了这个错误消息
(语法错误:意外的文件结尾)else if
(语法正确)elif
我通过注释位来调试它,直到它工作为止确保存在.sh文件的目录名没有空格字符。e、 g:假设它在一个名为“新文件夹”的文件夹中,你肯定会遇到你所引用的错误。只需将其命名为“新建文件夹”。我希望这能有所帮助。所以我找到了这篇文章,答案对我没有帮助,但我能够找出它给我错误的原因。我有一个
cat > temp.txt < EOF
some content
EOF
cat>temp.txt
问题是我将上述代码复制到函数中,无意中对代码进行了标记。需要确保最后一个EOF没有标记 显然,当脚本的最后一行缺少换行符时,某些版本的shell也会发出此消息。unclosed if=>fi子句也会发出此消息 提示:如果您的脚本很大,请使用陷阱进行调试 e、 g 这个答案是我从 在Vim中打开该文件并重试
:设置fileformat=unix
将eh行结尾转换为unix结尾,看看这是否解决了问题
问题如果在Vim中编辑,请输入命令:set fileformat=unix和
保存文件。其他几个编辑器可以转换行
结尾,如记事本++或Atom
感谢Ubuntu中的@lemongrassinger:
$ gedit ~/.profile
然后,
文件->另存为
并将结束行
设置为Unix/Linux
当我在一行中编写“if-fi”语句时出现问题:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
写入多行解决了我的问题:
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
我知道我来不及参加聚会了。希望这能帮助别人 检查您的.bashrc文件。也许重命名或移动它
这里的讨论:当我试图使用parens调用函数时,这种情况就发生了,例如
run() {
echo hello
}
run()
应该是:
run() {
echo hello
}
run
适用于WINDOWS: 在我的例子中,我在Windows操作系统上工作,在运行autoconf时遇到了相同的错误
- 我只需用我的NOTEPAD++IDE打开configure.ac文件
- 然后,我使用EOL转换将文件转换为Windows(CR LF),如下所示: 编辑->下线转换->窗口(CR LF)
brew install dos2unix
sh <file.sh>
brew安装dos2unix
嘘
正如我刚刚发现的,函数定义中缺少右大括号将导致此错误
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
当然应该是这样的
function whoIsAnIidiot() {
echo "not you for sure"
}
在我的例子中,有一个冗余的
\
,如下所示:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
在
DATA.PATH\u前缀的末尾有NOTa\
。/afs/kinetics400
我仍然得到相同的错误。我不太清楚代码哪里出错了。奇怪的是,我剪切并粘贴了你的代码,它按预期工作。是否还有其他错误输出?很多时候bash会列出一个行号。还有,你在运行什么系统?(Linux、MacOS、BSD、发行版等)这个问题背后的原因是什么?我通常在Windows上工作,但需要将脚本传输到unix系统。Windows中的换行符是“\r\n”,而linux中的换行符是“\n”。@KeesdeKooter我不会因为某些东西不适合你就说你应该否决它,很明显,它对28票的赞成票有效。一个对我不起作用的简单例子就足够了。这就是为什么允许对一个问题有多个答案的原因,因为一个问题可以有多个解决方案。使用记事本++编辑器编辑>EOL转换>旧Mac格式为我解决了这个问题。在安装之前,请尝试(在vim中)“:set fileformat=unix”。这对我在Windows Linux子系统(WSL)中起到了作用。+1也适用于带括号的代码段,如:[[“$#”==1]&&&[“$arg”==1,2,3,4]]&&printf“%s\n”blah“|{printf”%s\n“blahblah”;用法:。。。。。。。。。。。。请注意,分号在曲线中
brew install dos2unix
sh <file.sh>
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
function whoIsAnIidiot() {
echo "not you for sure"
}
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}