/bin/sh 無効な動作

/bin/sh 無効な動作

いくつかの簡単なフラグを使用して実行スクリプトを作成しようとしています。/bin/sh

#!/bin/sh

set -eux

if [ "$DEBUG" = "true" ]; then
    debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=$SUSPEND,address=$DEBUG_PORT"
else
    debug=''
fi

serv="--server.port=${SERVER_PORT}"
prop="--spring.profiles.active=${PROFILES}"

all="${serv:-} ${prop:-}"

java "${debug:-}"-jar /opt/someJar.jar "${all:-}"

今、私たちは説明できず、なぜそのようなことが起こるのか私たちが見つけることができないいくつかの問題を見つけました。

  1. "${debug:-}"-jar席がないので参考にしてください。スペースを入れると、「javaはメインクラスを見つけるかロードできません」というメッセージでアプリケーションがクラッシュします。スペースを削除すると、期待どおりに機能します。
  2. 2つの変数servprop。これら2つをjavaコマンドの最後に入れると、"${serv:-}" "${prop:-}"これら2つのパラメータはアプリケーションから別々に渡されます。しかし、"${all:-}"Javaの例外から増やすと、これら2つが互いに接続されていることがわかります。
Caused by: java.lang.NumberFormatException: For input string: "1234--spring.profiles.active=some-profile"

でもset -eux印刷されるから

+ java -jar /opt/someJar.jar --server.port=1234 --spring.profiles.active=some-profile

それが私が本当に欲しいものです。

何らかの理由で十分な情報を提供できない場合は、追加情報を提供できます。私が達成しようとしているのは、これがなぜこれを行うのか、そして/bin/shそのような単純なスクリプトでそれを使用する方法を理解することです。

ベストアンサー1

Stéphaneは$@これを通常のシェルで配列として使用すると述べました。 1つの方法は次のとおりです。

#!/bin/sh

set -eux
set --      # clear cmdline params

if [ "$DEBUG" = "true" ]; then
    set -- "-Xdebug" "-Xrunjdwp:transport=dt_socket,server=y,suspend=$SUSPEND,address=$DEBUG_PORT"
fi

# specify the jar file
set -- "$@" -jar /opt/someJar.jar

# add the port and profile
set -- "$@" "--server.port=${SERVER_PORT}" 
set -- "$@" "--spring.profiles.active=${PROFILES}"

# and run it
java "$@"

おすすめ記事