【问题标题】:Downloading/Buidling minecraft server jars using BuildTools in Bash/Shell script在 Bash/Shell 脚本中使用 BuildTools 下载/构建 minecraft 服务器 jar
【发布时间】:2017-10-10 05:44:57
【问题描述】:

我正在尝试编写一个 bash/shell 脚本来下载 BuildTools 并用它编译 jar,之后我想从 /home/buildtools/ 的脚本中将它们移动到我的网络服务器 (/var/www/html/jars/)

BuildTools 下载/编译 jars 并将它们放在基本目录中,除了 vanilla 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)只有一个文件,我该怎么做?

【问题讨论】:

  • 使用set -x 查看脚本的调试输出。

标签: linux bash shell jar minecraft


【解决方案1】:

这是因为条件表达式中的括号,以及试图在表达式的错误部分使用 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 原则还很陌生,但其中大部分确实有很大帮助,如上所述,我感谢您,但我会尝试使用您的建议完全重写它。但我只想要 Spigot-.jar、Craftbukkit-.jar 和 minecraft_server.*.jar 并全部上传到我的网络服务器
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2019-12-03
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多