【问题标题】:'bash: syntax error near unexpected token `do [duplicate]'bash:意外标记附近的语法错误`do [重复]
【发布时间】:2018-02-16 07:55:27
【问题描述】:

我创建了下面的 bash 脚本来替换工作副本的 SVN URL。

我可以确认这在我的 Linux 系统上完美运行,但是它在我的 Mac OS 系统上无法运行。我将能够提供我稍后回来的错误,但想知道是否有人可以指出我正确的方向。我相信这与 WORKING_DIR 变量中的空格有关,我尝试了在 Google 上找到的许多变体,包括转义空格 \ 添加 " 和 ' 但仍然没有运气。

#!/bin/bash
filepath=$(pwd)
URL=https://192.168.22.225/svn
WORKING_DIR="/Users/user/Documents/Working Copies"
cd "${WORKING_DIR}"
for f in "${WORKING_DIR}"/*
do
        if [[ -d $f ]]; then
        (
        cd "${f##*/}"
        #printf "\n$PWD\n${URL}/${f##*/}\n"
        svn relocate "${URL}"/"${f##*/}"
        )
        fi
done
cd "$filepath"

错误:

: No such file or directoryments/Working Copies
'bash: working.sh: line 7: syntax error near unexpected token `do
'bash: working.sh: line 7: `do

【问题讨论】:

  • 引用你的变量。阅读:unix.stackexchange.com/q/171346/4667
  • 使用shellcheck.net——它会指出未引用的变量,以及其他一些问题。在这种情况下:始终测试cd 命令以确保它们有效,否则脚本的其余部分将在错误的位置执行!
  • 您的脚本有 DOS 换行符。运行dos2unix,或者在vim中打开并运行:set fileformat=unix并保存。

标签: bash


【解决方案1】:

这是赠品:

'bash: working.sh: line 7: syntax error near unexpected token `do
'bash: working.sh: line 7: `do

看到前面的' 了吗?这应该打印在行的 end 处。

将光标送回行首的是一个 CR 字符,也称为$'\r'。因此,您使用的是do$'\r',而不是do,当shell 尝试打印unexpected token `do' 时,CR 会将光标发送到行首,因此结束的' 会打印在那里。

这是因为在 DOS 风格的系统上,换行符是两个字符,CRLF,而在 UNIX 上它们只是 CR。

【讨论】:

  • 我确实显示并确保行尾是 UNIX 样式。它无法解释为什么该脚本可以完美地在我的 Linux 机器上运行,但不能在我的 Mac OS X 系统上运行......我会仔细检查,但我确实替换了行尾以确保
  • 它确实解释了它:但是你在平台之间复制的脚本没有保留行尾。
  • 运行 brew install unix2dos。然后使用 dos2unix 文件进行转换。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-01
  • 2016-09-06
  • 1970-01-01
  • 2014-02-26
  • 2018-12-18
  • 2014-01-20
相关资源
最近更新 更多