我试图编写一个bash / shell脚本来下载BuildTools并用其编译jar,之后我想将它们从/var/www/html/jars/脚本中移至我的Web服务器(/home/buildtools/)。

BuildTools下载/编译jar并将其放置在基本目录中,除了香草jar之外,香草jar位于基本目录内的work/处。

即使确实下载/编译了jar,它们也不会全部移动到所需的目录。

这是我目前正在使用的代码(我认为可能与提供这些代码有关):

directory="$(pwd)/"
jar="BuildTools.jar"
path="${directory}${jar}"
output="/var/www/html/jars"
version=$1

if [[ ( -d "BuildData" ) || ( -d "Spigot" ) || ( -d "CraftBukkit" ) || ( -d "Bukkit" ) || ( -d "work" ) || ( -d "apache-maven-*" ) || ( -f "BuildTools.log.txt" ) ]]; then
    echo "Cleaning up..."
    rm -f -r BuildData/ Spigot/ CraftBukkit/ Bukkit/ work/ apache-maven-*/
    rm -f BuildTools.log.txt spigot-*.jar craftbukkit-*.jar vanilla-*.jar
fi

if [[ ! -f "${jar}" ]]; then
    echo "Downloading BuildTools..."
    wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -O ${jar}
    chmod 775 ${jar}
fi

if [[ ! -z "${version}" ]]; then
    echo "Compiling jars for version ${version}..."
    java -jar ${jar} --rev ${version}
else
    echo "No version specified."
    echo "Compiling jars for the latest version..."
    java -jar ${jar} --rev latest
fi

if [[ ( -f "${directory}spigot-*.jar" ) || ( -f "${directory}craftbukkit-*.jar" ) ]]; then
    echo "Compilation is done. Re-organizing..."

    if [[ ! -z "${version}" ]]; then
        mv work/minecraft_server.*.jar ${directory}/vanilla-${version}.jar
    else
        mv work/minecraft_server.*.jar ${directory}/vanilla-latest.jar
    fi

    echo "Moving jars to the webserver..."
    mv ${directory}/vanilla-*.jar ${output}/
    mv ${directory}/spigot-*.jar ${output}/
    mv ${directory}/craftbukkit-*.jar ${output}/
else
    echo "Could not re-organize, the jars hasn't been moved."
fi


编辑:
通过执行以下命令:./compile.sh 1.8.6
出于某种原因,jarfile不是正确的名称。

Result of the code.

directory="$(pwd)/"
jar="BuildTools.jar"
path="${directory}${jar}"
output="/var/www/html/jars"
version=$1

if [[ ( -d "BuildData" ) || ( -d "Spigot" ) || ( -d "CraftBukkit" ) || ( -d "Bukkit" ) || ( -d "work" ) || ( -d "apache-maven-*" ) || ( -f "BuildTools.log.txt" ) ]]; then
    echo "Cleaning up..."
    rm -f -r BuildData/ Spigot/ CraftBukkit/ Bukkit/ work/ apache-maven-*/
    rm -f BuildTools.log.txt done.txt spigot-*.jar craftbukkit-*.jar vanilla-*.jar
fi

if [[ ! -f "${jar}" ]]; then
    echo "Downloading BuildTools..."
    wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -O ${jar}
    chmod 775 ${jar}
fi

if [[ ! -z "${version}" ]]; then
    echo "Compiling jars for version ${version}..."
    java -jar ${jar} --rev ${version}
    echo "done" > done.txt
else
    echo "No version specified. Compiling jars for the latest version..."
    java -jar ${jar} --rev latest
    echo "done" > done.txt
fi

if [[ -f "done.txt" ]]; then
    echo "Compilation is done. Re-organizing..."

    for x in $(find ${directory} \( -name "*.jar" \)); do
        name=$(basename "${x}" ".jar")

        if [[ ${name} =~ ^(spigot|craftbukkit|minecraft_server)(-)?(.*)? ]]; then
            fullname="${name}.jar"

            echo "Jar found: ${fullname}, Moving to webserver..."

            if [[ ! -z "${version}" ]]; then
                outpath=${output}/${version}

                if [[ ! -d ${outpath} ]]; then
                    mkdir ${outpath}
                fi

                mv -f ${x} ${outpath}/${fullname}
            else
                outpath=${output}/latest

                if [[ ! -d ${outpath} ]]; then
                    mkdir ${outpath}
                fi

                rm -f -r ${outpath}
                mv -f ${x} ${outpath}/${fullname}
            fi
        fi
    done

    echo "Jars uploaded."
else
    echo "Could not re-organize, the jars hasn't been moved."
fi


另外,我只希望上传一个文件(Vanilla,Spigot和Craftbukkit),我该怎么做?

最佳答案

这是由于条件表达式中的括号以及试图在表达式的错误部分使用glob(您无法对glob使用类似的测试)。

要解决此问题,您应该执行以下操作:

#set nullglob so non-matching globs return an empty string instead of an error
shopt -s nullglob
# assing the globs to arrays, note the quoting
spigotfiles=("${directory}"spigot-*.jar)
bukkitfiles=("${directory}"craftbukkit-*.jar)
# using an array without an index gives us the first item in the array
if [[ -f "$spigotfiles" || -f "$bukkitfiles" ]]; then
     ...
fi


括号中也有同样的错误,您的清除代码中也有此错误,您只需删除括号即可解决该错误(例如[[ -d "dirname" || -d "fooname" ]]

您还应在每种情况下(例如在命令的一部分中)引用变量扩展(例如"${jar}"等)。

同样使用[[ ! -z $foo ]][[ -n $foo ]]相同

编辑:

不要做

for x in $(find ${directory} \( -name "*.jar" \)); do


但相反只是:

for x in *.jar; do


或者,如果您只需要版本文件,则可以执行以下操作:

for x in *"-${version}.jar"; do


您仍然需要清除检查中的括号,请参阅上面的答案。

在脚本的最后,这些行会适得其反:

            if [[ ! -d ${outpath} ]]; then
                mkdir ${outpath}
            fi
            rm -f -r ${outpath}
            mv -f ${x} ${outpath}/${fullname}


当您首先创建一个目录时,然后将其删除,然后尝试将其移动到其中(提示:删除rm行)

关于linux - 使用Bash/Shell脚本中的BuildTools下载/构建Minecraft服务器jar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43911743/

10-12 00:13
查看更多