【问题标题】:Bash script: syntax error near unexpected token `do'Bash 脚本:意外标记“do”附近的语法错误
【发布时间】:2015-06-16 01:58:52
【问题描述】:

谁能帮我弄清楚为什么我会收到这个错误,意外标记“do”附近的语法错误。我已经尝试研究答案,但到目前为止还没有运气。以下是我的代码的一部分

while
do
if [[ "${ScanConfirm}" == "Y" ]]; then
    # use a for Loop to scan the chosen directory and for every non-MDF file in the directory it creates an MDF file in a temp-MDF directory
    XCOUNT=0
    echo
    echo "Scanning Directory.. this may take a few minutes"
    echo "*************************************************"
    echo
    export TEMP_MDF="${StartingDir}/MDF_${RANDOM}"
    mkdir -p ${TEMP_MDF}

    for FILE in `find ${Dir2Scan} -type f`
    do
    export ERRORFILE=${FILE}
    BASEFILE=`basename ${FILE}`
    BASEDIR=`dirname ${FILE}`

    # echo priority 50 >>"${TEMP_MDF}/${BASEFILE}.mdf" <----------- you can take out this arrow and uncomment this to put in priorities
    # echo categoryName=${Category} >> "${TEMP_MDF}/${BASEFILE}.mdf" <----------- if you want the category you entered about to show up in MDF you need to uncomment the lines above this note
    echo objectName=${RANDOM}${RANDOM}_${NamePrefix}_${BASEFILE} >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo "<comments>" >>"${TEMP_MDF}/${BASEFILE}.mdf"
    echo "${Comments}" >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo "</comments>" >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo "originalServer=${BASEDIR}">>"${TEMP_MDF}/${BASEFILE}.mdf"
    # echo "originalPath=${BASEDIR}">>"${TEMP_MDF}/${BASEFILE}.mdf"
    chaine=`basename ${BASEDIR}`
    # echo "sourceDestinationDIVAPath=${chaine}" >>"${TEMP_MDF}/${BASEFILE}.mdf"
    echo >> "${TEMP_MDF}/${BASEFILE}.mdf"
    echo "<fileList>" >>"${TEMP_MDF}/${BASEFILE}.mdf"
    mv "${TEMP_MDF}/${BASEFILE}.mdf" "${TEMP_MDF}/${BASEFILE}_${RANDOM}.mdf"
    ERRORLEVEL=$?
    if [ ${ERRORLEVEL} -ne 0 ]; then
        Stop
    fi
    XCOUNT=$((${XCOUNT}+1))
    echo "${XCOUNT}/${OriginalCount} MDF Files Created ${BASEFILE}.mdf"
    done

【问题讨论】:

  • while 什么?你需要给while 一些东西来测试,看看它应该多久做一次你想做的事情。
  • 另外,您似乎至少缺少一个done 和一个fi
  • 还可以考虑在此处询问之前使用shellcheck.net 进行自动分析。这个脚本还有很多错误,如果 shellcheck 会为您提供所有这些,那么我们花时间一点一点地完成它是很愚蠢的。
  • ...事实上,这不仅仅是重现您所询问的单个问题所需的最短代码。见stackoverflow.com/help/mcve
  • 另外,不要在每一行放置一个具有相同文件名的&gt;&gt;。每一次重定向都会重新打开输出文件——与只打开一次文件并在需要时保持打开状态相比,这意味着效率非常低。最好将一个&gt;"$TEMP_MDF/$BASEFILE.mdf" 放在整个循环的末尾(即done),或者,如果您希望在较小的块内创建它,则使用{} 来创建一个,并将重定向放在}

标签: macos bash shell


【解决方案1】:

来自help while

while:while 命令;执行命令;完成

COMMANDS 在语法中都不是可选的。


如果您想要无限循环,请考虑:

while :; do

while true; do

...它们在语义上是相同的(:true 都是内置命令,它们会以状态 0 无条件退出)。

【讨论】:

  • 谢谢。添加 while :修复了问题
猜你喜欢
  • 2016-09-06
  • 2015-03-31
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
相关资源
最近更新 更多