Угадайте домашний каталог JDK

В моем проекте используется определенная версия JDK, которая является jdk-6, а путь JDK_HOME по умолчанию будет отличаться от дистрибутива к дистрибутиву, поэтому я написал сценарий, чтобы угадать его. Есть ли способ сделать это лучше?

#!/bin/bash
JAVA_HOME=""
JDK_TEMP=""
shopt -s extglob

JDK_ROOT_DIR=( /usr/java/ /usr/java/jdk/  /usr/j2se/  /usr/j2se/ /usr/j2sdk/ /usr/jdk/ /usr/lib/java/ /usr/lib/j2se/ /usr/lib/j2sdk/ /usr/lib/jdk/ /usr/lib/jvm/java/ /usr/lib/jvm/j2se/ /usr/lib/jvm/j2sdk/ /usr/lib/jvm/jdk/ /usr/local/java/ /usr/local/java/jdk/ /usr/local/jdk/ /opt/java/ /opt/j2se/ /opt/j2sdk/ /opt/j2sdk/ /opt/jdki/ /usr/lib/jvm/ )
for sub_dir in "${JDK_ROOT_DIR[@]}"
do

#                                                 #
# For each subdirectory inside the root directory #
#                                                 #
#                                                 #
    # For openjdk                                 #
    for jdk_dir in $sub_dir/java-*6*-openjdk*!(common) ; do
        if [[ -d $jdk_dir ]]; then
            echo  $jdk_dir
            export JAVA_HOME=$jdk_dir
            exit 0
        fi
    done


    # for IBM Java                                #
    for jdk_dir in $sub_dir/java-1_6_0-ibm-!(common) ; do
        if [[ -d $jdk_dir ]]; then
            echo $jdk_dir
            export JAVA_HOME=$jdk_dir;
            exit 0
        fi
    done

    # for raspbian java                           #
    for jdk_dir in $sub_dir/jdk-8-oracle-arm32-!(common) ; do
        if [[ -d $jdk_dir ]] ; then
            echo  $jdk_dir
            export JAVA_HOME=$jdk_dir
            exit 0
        fi 
    done
done


echo "JDK directory not found." 
8 голосов | спросил sandun dhammika 21 12016vEurope/Moscow11bEurope/MoscowMon, 21 Nov 2016 10:13:09 +0300 2016, 10:13:09

1 ответ


12

Переменные

Строка, содержащая определение JDK_ROOT_DIR=( … ), настолько длинна, что она не читается и не поддается контролю. Фактически, вы дважды указали /usr/j2se/. Это помогло бы поместить одну запись в каждую строку.

Переключатель в именовании в for sub_dir in "${JDK_ROOT_DIR[@]}" запутан. Каждый «корневой каталог» внезапно называется «sub dir»?

Операторы export JAVA_HOME=$jdk_dir бессмысленны, так как вы сразу же выходите после установки переменной. В этом случае исходный код JAVA_HOME="" и JDK_TEMP="" назначения также бесполезны.

Я знаю, что вы не ожидаете каких-либо пробелов или специальных символов в этих именах каталогов, но я все же предпочел бы использовать двойные кавычки в соответствии с лучшей практикой.

Подстановка

Ваши три случая (для OpenJDK, IBM и Raspbian) почти идентичны и могут обрабатываться вложенным циклом.

Вы также должны shopt -s nullglob, чтобы избежать ненужного выполнения -d при неудачных расширениях glob.

Предлагаемое решение

Кроме того, я думаю, что отказ найти каталог JDK должен привести к ненулевому коду выхода, и сообщение об ошибке должно быть, вероятно, напечатано со стандартной ошибкой, а не с стандартным выходом.

#!/bin/bash

shopt -s extglob nullglob

JDK_ROOT_DIRS=(
    /usr/java
    /usr/java/jdk
    /usr/j2se
    /usr/j2sdk
    /usr/jdk
    /usr/lib/java
    /usr/lib/j2se
    /usr/lib/j2sdk
    /usr/lib/jdk
    /usr/lib/jvm/java
    /usr/lib/jvm/j2se
    /usr/lib/jvm/j2sdk
    /usr/lib/jvm/jdk
    /usr/local/java
    /usr/local/java/jdk
    /usr/local/jdk
    /opt/java
    /opt/j2se
    /opt/j2sdk
    /opt/jdki
    /usr/lib/jvm
)
SUBDIR_GLOBS=(
    'java-*6*-openjdk*!(common)'            # OpenJDK
    'java-1_6_0-ibm-!(common)'              # IBM Java
    'jdk-8-oracle-arm32-!(common)'          # Raspbian Java
)

for root_dir in "${JDK_ROOT_DIRS[@]}" ; do
    for subdir_glob in "${SUBDIR_GLOBS[@]}" ; do
        for jdk_dir in "$root_dir"/$subdir_glob ; do
            if [ -d "$jdk_dir" ]; then
                echo "$jdk_dir"
                exit 0
            fi
        done
    done
done

echo "JDK directory not found." >&2
exit 1
ответил 200_success 21 12016vEurope/Moscow11bEurope/MoscowMon, 21 Nov 2016 10:52:18 +0300 2016, 10:52:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132