执行 bash 变量(包含另一个变量)作为命令并将结果分配给变量
execute bash variable (contains another variables) as a command and assign the result to a variable
我看到以前回答过类似的问题,但我的情况有点不同:
- 我需要将命令存储在变量中,以便我可以在 运行
之前记录它
- 命令包含的变量可以包含space字之间
- 执行的结果必须赋值给一个新的变量
这是从终端正常运行的命令:
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"
变量:
- DB_HOST=oracle-db
- DB_PORT=1521
- DB_NAME=ORCLPDB1.localdomain
- DB_USERNAME="SYS 作为 SYSDBA"
- DB_PASSWORD=Oradoc_db1
测试:
$ 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 命令定义为变量并不是一个好习惯。我会推荐:
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)"
我会尝试解决一些一般性问题。
-
创建命令时,您的用户名包含 space (DB_USERNAME="SYS as SYSDBA"
),因此您需要将它们用引号引起来;
COMMAND="... -v -U '${DB_USERNAME}' -P ${DB_PASSWORD} ...
When to wrap quotes around a shell variable?;
while [[ "${_RESULT}" ]]
_RESULT="$($_COMMAND)"
_JSON="$($_COMMAND)"
if [ "$VERBOSE" = "false" ]
使用类似 https://www.shellcheck.net/ 的方法将有助于发现那些 bash 错误
我看到以前回答过类似的问题,但我的情况有点不同:
- 我需要将命令存储在变量中,以便我可以在 运行 之前记录它
- 命令包含的变量可以包含space字之间
- 执行的结果必须赋值给一个新的变量
这是从终端正常运行的命令:
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"
变量:
- DB_HOST=oracle-db
- DB_PORT=1521
- DB_NAME=ORCLPDB1.localdomain
- DB_USERNAME="SYS 作为 SYSDBA"
- DB_PASSWORD=Oradoc_db1
测试:
$ 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 命令定义为变量并不是一个好习惯。我会推荐:
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)"
我会尝试解决一些一般性问题。
创建命令时,您的用户名包含 space (
DB_USERNAME="SYS as SYSDBA"
),因此您需要将它们用引号引起来;COMMAND="... -v -U '${DB_USERNAME}' -P ${DB_PASSWORD} ...
When to wrap quotes around a shell variable?;
while [[ "${_RESULT}" ]]
_RESULT="$($_COMMAND)"
_JSON="$($_COMMAND)"
if [ "$VERBOSE" = "false" ]
使用类似 https://www.shellcheck.net/ 的方法将有助于发现那些 bash 错误