как назначить переменную в сценарии оболочки - PullRequest
0 голосов
/ 05 февраля 2020

У меня ниже код сценария оболочки, который работает нормально.

#!/bin/sh

run() {
  cd /tmp/in/current 
  java \
    -Dlog4j.configurationFile=/tmp/in/logging/log4j2_Importer.xml \
    -Djava.security.egd=file:///dev/urandom \
    -classpath /tmp/in/runner/lib/*:/tmp/in/lib/* \
    baag.runner.Application \
    --config /tmp/in/config/import.dev.properties.TODO \
    --workflow import \
    --inputDir "$1"
}

dev_path="/data/etl-dev/in/eurex"
simu_path="/data/etl-simu/in/eurex"

mode=$1

case "$mode" in
    "$dev_path" | "$simu_path" ) 
        run "$mode" 
        ;;
    *)  echo "error: invalid mode" >&2
        exit 1
        ;;
esac

Но в настоящее время я могу запустить этот код только в базе данных dev, как вы можете видеть в скрипте функции запуска. import.dev.properties.TODO установлен как dev. Я хочу сделать это гибким, так что если путь к переменной «/ tmp / in / simu» для переменной simu_path, то свойства должны быть import.simu.properties.TODO, а для dev_path - import.dev.properties.TODO, чтобы он работал в соответствующей базе данных.

Я не уверен, возможно ли здесь установить параметризованную переменную. Например, что-то вроде этого import.${varaible_here_dev_or_simu}.properties.TODO

Я хочу оставить dev_path и simu_path такими, какими они могут быть изменены, когда я передаю это в аргументе

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Измените import.dev.properties.TODO на import."$2".properties.TODO в функции запуска. И используйте это следующим образом.

run "$mode" "$whatever_you_name_it"

И мы могли бы отразить это немного

#!/bin/sh

path="${1:-/tmp/in}" # set /tmp/in as default path
mode="${2:-dev}"     # set dev as default mode
# or switch them if mode needs to be changed more recent
#path="${2:-/tmp/in}"
#mode="${1:-dev}"

run() {
    cd "$path"/current
    java -classpath "$path"/runner/lib/*:"$path"/lib/* baag.runner.Application \
         -Dlog4j.configurationFile="$path"/logging/log4j2_Importer.xml \
         --config "$path"/config/import.$1.properties.TODO" \
         -Djava.security.egd=file:///dev/urandom \
         --inputDir "$path/$1" \
         --workflow import
}

case "$mode" in
    "dev|simu") run "$mode" ;;
    *         ) echo "error: invalid mode" >&2; exit 1;;
esac
1 голос
/ 05 февраля 2020

Насколько я знаю, bash, к сожалению, не поддерживает конструкции, подобные ассоциативным массивам, которые могли бы быть возможным решением, предшествующая версия 4.

Если пути для сред выглядят одинаково, Вы можете написать это так:

#!/bin/sh

base_path="/tmp/in"

dev_env="dev"
simu_env="simu"

run() {
cd /tmp/in/current; java -Dlog4j.configurationFile=/tmp/in/logging/log4j2_Importer.xml -Djava.security.egd=file:///dev/urandom -classpath /tmp/in/runner/lib/*:/tmp/in/lib/* baag.runner.Application --config /tmp/in/config/import.$1.properties.TODO --workflow import --inputDir "$base_path/$1"
}

mode=$1

case "$mode" in
    "$dev_env" | "$simu_env" ) 
        run "$mode" 
        ;;
    *)  echo "error: invalid mode" >&2
        exit 1
        ;;
esac

Примечание. В этой реализации вам придется передавать dev или simu в сценарий, а не весь путь. Если вам нужно пройти полный путь, вы должны изменить "$dev_env" | "$simu_env" ) на "$base_path/$dev_env" | "$base_path/$simu_env" )

ОБНОВЛЕНИЕ

Предполагая, что структура пути и среды фиксированы, вы может извлечь окружение с помощью простого регулярного выражения и передать его функции в качестве параметра секунды, например:

#!/bin/sh

dev_path="/data/etl-dev/in/eurex"
simu_path="/data/etl-simu/in/eurex"
prod_path="/data/etl-prod/in/eurex"

environments="(dev|simu|prod)"

run() {
    cd /tmp/in/current; java -Dlog4j.configurationFile=/tmp/in/logging/log4j2_Importer.xml -Djava.security.egd=file:///dev/urandom -classpath /tmp/in/runner/lib/*:/tmp/in/lib/* baag.runner.Application --config /tmp/in/config/import.$2.properties.TODO --workflow import --inputDir "$1"
}

mode=$1

case "$mode" in
    "$dev_path" | "$simu_path" )
        environment=$(echo $mode | sed -E "s/.*${environments}.*/\\1/")
        run "$mode" $environment
        ;;
    *)  echo "error: invalid mode" >&2
        exit 1
        ;;
esac
...