执行 bash 变量(包含另一个变量)作为命令并将结果分配给变量

execute bash variable (contains another variables) as a command and assign the result to a variable

我看到以前回答过类似的问题,但我的情况有点不同:

这是从终端正常运行的命令:

java -jar ${ORACLE_HOME}/bin/sql-command-line-tool/sql-runner-0.2.2-with-dependencies.jar -v -U ${DB_USERNAME} -P ${DB_PASSWORD} -j jdbc:oracle:thin:@${DB_HOST}:${DB_PORT}/${DB_NAME} "select 1 from dual"

变量:

测试:

$ echo $DB_USERNAME
"SYS as SYSDBA"

这是我想要使用的方式,但这不起作用:

echo "checking whether database server is up and running..."
_COMMAND="java -jar ${ORACLE_HOME}/bin/sql-command-line-tool/sql-runner-0.2.2-with-dependencies.jar -v -U ${DB_USERNAME} -P ${DB_PASSWORD} -j jdbc:oracle:thin:@${DB_HOST}:${DB_PORT}/${DB_NAME} \"select 1 from dual\""
echo "command: $_COMMAND"
_RESULT=$($_COMMAND)
_SHOW_MESSAGE=true

while [[ ${_RESULT} ]]
do
    if [ $_SHOW_MESSAGE = "true" ]; then echo "the database server is not running yet, waiting..."; fi
    if [ $VERBOSE = "false" ]; then _SHOW_MESSAGE="false"; fi
    sleep 0.5
    _JSON=$($_COMMAND)
done
echo "database server is up and running"

错误:

Unmatched arguments from index 4: 'SYSDBA"', '"select', '1', 'from', 'dual"'

我使用的罐子可以从here获得。

我尝试过以不同的方式使用单引号和双引号,尝试过使用 eval 但没有一个能正常工作。

我错过了什么?

一般来说,将 bash 命令定义为变量并不是一个好习惯。我会推荐:

  1. 创建别名
  2. 创建 bash function
  3. 创建一个 bash script 并使用 sourcebash 适当地调用它。

Bash 函数示例

_COMMAND() {
    # Argument parsing with default values/error statements
    if [ -z ${ORACLE_HOME+x} ]
    then 
        echo "ERROR: ORACLE_HOME not defined"
        return 0
    fi
    DB_HOST=${1:-"oracle-db"}
    DB_PORT=${2:-1521}
    DB_NAME=${3:-"ORCLPDB1.localdomain"}
    DB_USERNAME=${4:-"SYS as SYSDBA"}
    DB_PASSWORD=${5:-"Oradoc_db1"}
    # Execute command
    java -jar "${ORACLE_HOME}/bin/sql-command-line-tool/sql-runner-0.2.2-with-dependencies.jar" -v -U "${DB_USERNAME}" -P "${DB_PASSWORD}" -j jdbc:oracle:thin:@"${DB_HOST}":${DB_PORT}/"${DB_NAME}" "select 1 from dual"
}

定义此函数后,您可以通过以下方式捕获调用结果:

_RESULT="$(_COMMAND)"

我会尝试解决一些一般性问题。


  1. 没有Bash Shebang

  2. 创建命令时,您的用户名包含 space (DB_USERNAME="SYS as SYSDBA"),因此您需要将它们用引号引起来;

    COMMAND="... -v -U '${DB_USERNAME}' -P ${DB_PASSWORD} ...
    
  3. When to wrap quotes around a shell variable?;

    while [[ "${_RESULT}" ]]
    
    _RESULT="$($_COMMAND)"
    
    _JSON="$($_COMMAND)"
    
    if [ "$VERBOSE" = "false" ]
    

使用类似 https://www.shellcheck.net/ 的方法将有助于发现那些 bash 错误