【问题标题】:how to assign variable in shell script如何在shell脚本中分配变量
【发布时间】:2020-02-05 10:16:30
【问题描述】:

我有以下运行正常的 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 设置为开发。我想让它变得灵活,如果 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 原样,因为它可以更改 当我在参数中传递它时

【问题讨论】:

  • 如果您将每个语句放在单独的行上,这将使您的 run 函数更易于阅读。
  • import.$(basename "$1").properties.TODO?
  • @TomFenech 确定我这样做了..@kamil 我会尝试使用 import.$(basename "$1").properties.TODO
  • 如果是一个长命令,别忘了用\ 转义换行符(我编辑这样做)

标签: bash shell command-line


【解决方案1】:

在运行函数中将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

【讨论】:

  • 我不明白 "$whatever_you_name_it" 我应该在这里放什么...你能解释一下吗?
  • 任何你想要的代替$2 in import."$2".properties.TODO
  • 我认为在这种情况下我应该使用 if 条件而不是 case 因为我将 case 条件放在一起 "$dev_path" | "$simu_path" 所以不明白
  • 我认为这种语法需要更改以防万一 dev|simu ?以及在运行脚本时我应该传递什么参数?以前我像 ./script.sh "/tmp/in" 一样运行,主要问题是我不想更改 dev_path 或 simu 路径,因为这条路径我在运行时正在参数中,它可能有点不同跨度>
  • 我已经更新了我的答案..正如我所说,如果我的 dev_path 和 simu_path 是这样的,那么我认为这将行不通..
【解决方案2】:

据我所知,遗憾的是 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" ) 更改为"$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

【讨论】:

  • 主要问题是我不想更改 dev_path 或 simu 路径,因为这条路径我在运行时正在争论中,它可能有点不同.. 我已经提到了这个问题
  • 好的明白了。另一种选择是创建两个数组。一个带有路径,另一个带有相应的环境。您需要一个函数来确定路径数组中的索引并使用它从环境数组中获取正确的值。看起来有点难看,但会工作。
  • 我们可以简单地将 simu 或 dev 放在模式中的任何位置并在运行脚本期间将其传递给相同的..例如 ./script.sh "dev" 或 ./script.sh "simu" 那么它会将 dev 或 simu 变量值放在脚本中任何需要的地方吗?因为现在我的 dev_path 和 simu_path 不固定
  • 只要您的路径中有特定的命名方案,您就可以提取该值。否则,您需要以某种方式将路径和环境结合在一起。
  • 我更新了我的帖子。简单来说,你可以用这样的一行来提取环境:environment=$(echo $mode | sed -E "s/.*(dev|simu).*/\\1/")
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2013-04-10
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多