Труба внутри массива
Как я могу выполнить конвейерную команду внутри массива?
Например:
$ ORACLE_USER=user1
$ ORACLE_PASS=password
$ ORACLE_CONN=database1
$ ORACLE_EXPDP_JOB_NAME=expdp-job-name
$ ORACLE_SQLPLUS_BIN=/opt/oracle/product/10.2.0/client/bin/sqlplus
$ ORACLE_SQLPLUS_PARAMS=( -S "${ORACLE_USER}"/"${ORACLE_PASS}"@"${ORACLE_CONN}" )
$ CMD=( echo -e \"DROP TABLE "${ORACLE_USER}".'\"${ORACLE_EXPDP_JOB_NAME}\"'\;\\nCOMMIT\;\\n\" \| ${ORACLE_SQLPLUS_BIN} "${ORACLE_SQLPLUS_PARAMS[@]}" )
$ "${CMD[@]}"
Это выводит:
"DROP TABLE user1.\"${ORACLE_EXPDP_JOB_NAME}\";
COMMIT;
" | /opt/oracle/product/10.2.0/client/bin/sqlplus -S user1/password@database1
Если я делаю eval, команда была выполнена правильно, было показано ниже:
$ eval "${CMD[@]}"
DROP TABLE user1."expdp-job-name"
*
ERROR at line 1:
ORA-00942: table or view does not exist
Commit complete.
НО, если внутри результата есть звездочка "*" и я хочу сохранить ее в переменной, команда eval будет интерпретировать звездочку, загромождая весь результат:
$ ls -l
total 2,1M
-rw-r--r-- 1 root root 0 2011-04-07 14:33 a.log
-rw-r--r-- 1 root root 186K 2011-04-06 12:05 DEBUG_AD.log
-rw-r--r-- 1 root root 1,7M 2011-04-06 10:38 REPORT.log
-rw------- 1 root root 57K 2011-04-06 10:38 sent
$ b=`eval "${CMD[@]}"`
$ echo $b
DROP TABLE user1."expdp-job-name" a.log DEBUG_AD.log REPORT.log sent ERROR at line 1: ORA-00942: table or view does not exist Commit complete.
Ты видел?? -> a.log DEBUG_AD.log REPORT.log - это файлы, которые интерпретируются eval, когда он встречает звездочку в результате. Я надеялся, что результат будет таким, как показано выше, без интерпретации звездочки.
1 ответ
Решил сам!
Мне нужно только повторить переменную с двойными кавычками, чтобы отменить интерпретацию звездочки.
echo "$b"
DROP TABLE user1."expdp-job-name"
*
ERROR at line 1:
ORA-00942: table or view does not exist
Commit complete.
Сожалею!