簡體   English   中英

如何在shell腳本中分配變量

[英]how to assign variable in shell script

我有下面的 shell 腳本代碼,它工作正常。

#!/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

但是目前我只能在開發數據庫上運行此代碼,正如您在運行函數腳本中看到的那樣, import.dev.properties.TODO設置為 dev。 我想讓它變得靈活,如果 simu_path 變量的路徑是“/tmp/in/simu”,那么屬性應該是import.simu.properties.TODO而對於 dev_path 它應該是import.dev.properties.TODO這樣它將在相應的數據庫上運行。

我不確定是否可以在這里設置參數化變量。 例如像這樣的東西import.${varaible_here_dev_or_simu}.properties.TODO

我想保持 dev_path 和 simu_path 原樣,因為我在參數中傳遞它時可以更改它

在運行函數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

據我所知,不幸的是 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

注意:在此實現中,您必須將devsimu傳遞給腳本而不是整個路徑。 如果需要傳遞完整路徑,則必須更改"$dev_env" | "$simu_env" ) "$dev_env" | "$simu_env" )"$base_path/$dev_env" | "$base_path/$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM