请原谅我这是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后:
语法错误:意外的文件结尾
答案 0 :(得分:106)
我认为file.sh与CRLF行终止符有关。
运行
dos2unix file.sh
然后问题就解决了。
您可以使用以下命令在ubuntu中安装dos2unix:
sudo apt-get install dos2unix
答案 1 :(得分:94)
要检查的另一件事(刚刚发生在我身上):
即。这个看似无辜的片段会导致同样的错误:
die () { test -n "$@" && echo "$@"; exit 1 }
让愚蠢的解析器开心:
die () { test -n "$@" && echo "$@"; exit 1; }
答案 2 :(得分:27)
我也是通过在if
子句
else if
(语法错误:意外的文件结尾)elif
(正确的语法)我通过注释位来调试它直到它工作
答案 3 :(得分:11)
未关闭的if => fi子句也会提出这个问题
提示:如果您的脚本很大,请使用陷阱进行调试......
e.g。
set -x
trap read debug
...
答案 4 :(得分:6)
关于cygwin我需要: -
export SHELLOPTS
set -o igncr
<。>在.bash_profile中。这样我就不需要运行unix2dos 了
答案 5 :(得分:6)
我从this similar problem on StackOverflow
得到了这个答案在Vim中打开文件并尝试
:set fileformat=unix
将eh行结尾转换为unix结尾,看看是否能解决问题 问题。如果在Vim中编辑,请输入命令:set fileformat = unix and 保存文件。其他几个编辑器有能力转换线 结尾,例如Notepad ++或Atom
谢谢@lemongrassnginger
答案 6 :(得分:5)
所以我发现这篇文章并且答案对我没有帮助,但我能够弄清楚为什么它给了我错误。我有一个
cat > temp.txt < EOF
some content
EOF
问题是我将上面的代码复制到一个函数中并且无意中将代码选中。需要确保最后一个EOF没有标签。
答案 7 :(得分:3)
如我刚发现的那样,在函数定义上缺少右花括号会导致此错误。
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
当然应该是这样的...
function whoIsAnIidiot() {
echo "not you for sure"
}
答案 8 :(得分:2)
在我的情况下,如下所示有一个多余的\
:
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
}
在\
的末尾有{strong>否一个DATA.PATH_PREFIX ./afs/kinetics400
答案 9 :(得分:1)
我在一行中编写“ if-fi”语句时遇到了问题:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
写多行代码解决了我的问题:
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
答案 10 :(得分:1)
我能够将代码剪切并粘贴到文件中,并且运行正常。如果你 像这样执行它应该工作:
你的“file.sh”:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
命令:
$ ./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 shell兼容性):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
答案 11 :(得分:0)
显然,当脚本的最后一行缺少换行符时,某些版本的shell也会发出此消息。
答案 12 :(得分:0)
确保.sh文件所在目录的名称没有空格字符。例如:假设它位于名为“新文件夹”的文件夹中,您必须遇到您引用的错误。而只是将其命名为&#39; New_Folder&#39;。我希望这会有所帮助。
答案 13 :(得分:0)
在Ubuntu中:
$ gedit ~/.profile
然后,File -> Save as
并将end line
设置为Unix/Linux
答案 14 :(得分:0)
我知道我参加聚会太晚了。希望这可以帮助某人。
检查您的.bashrc文件。也许重命名或移动它。
此处讨论:https://firebase.google.com/docs/functions/video-series/
答案 15 :(得分:0)
例如,当我尝试使用parens调用函数时,这种情况正在发生。
run() {
echo hello
}
run()
应为:
run() {
echo hello
}
run
答案 16 :(得分:0)
对于Windows:
就我而言,我在Windows操作系统上工作,并且在运行autoconf时遇到相同的错误。
然后我将通过 EOL 转换的文件转换为 Windows(CR LF),如下所示:
编辑-> EOL转换-> WINDOWS(CR LF)
答案 17 :(得分:0)
对于使用MacOS的用户:
如果您收到Windows格式的文件并想在MacOS上运行并看到此错误,请运行以下命令。
brew install dos2unix
sh <file.sh>
答案 18 :(得分:0)
我只是将您的示例剪切并粘贴到文件中;它在bash下运行良好。我没有看到任何问题。
为了更好的衡量,您可能希望确保以换行符结束,尽管bash不应该关心。 (无论有没有最终换行,它都适合我。)
如果您不小心将控制字符嵌入文件中,您有时会看到奇怪的错误。由于它是一个简短的脚本,请尝试通过在StackOverflow上的问题中粘贴它来创建一个新脚本,或者只需重新键入它。
您使用的是什么版本的bash? (bash --version
)