私はスクリプト作成の初心者です。例えば、以下の SQL 関数の出力を別の変数に追加したいと思います。
month_end ()
{
mdate=$($SQLPLUS_HOME/sqlplus.exe -S $DBC << END
set pagesize 0 feedback off verify off heading off echo off;
select to_char(last_day(add_months(sysdate,-1)),'yyyymmdd') from dual;
exit;
END
)
}
echo すると $mdate からの出力は完璧です。 (20160531)
しかし、別の変数に追加すると、値全体が壊れてしまいます (Hello_20160531_WORLD.txt ではなく _WORLD.txt)。
FILENAME=Hello
EXTENSION=WORLD.txt
NAME=$FILENAME_${mdate}_${EXTENSION}
echo ${NAME}
答え1
これは、アンダースコアが_
変数名の有効な部分であるため、中括弧も必要になるためですFILENAME
。
NAME=${FILENAME}_${mdate}_${EXTENSION}
\r
他の回答に基づくと、の FILENAME 割り当て行または sqlplus の出力のいずれかにキャリッジ リターン ( ) があるようです。シェル スクリプトで$mdate
を実行するか、 を実行して、どちらであるかを確認します。sqlplus に気づいたのはつい最近です。cat -v
echo $mdate | cat -v
EXE、Cygwin のような環境で実行していると思われますが、この環境ではキャリッジ リターンが追加されている可能性があります。control mdate=${mdate//^M/}
-v、control-m と入力して、^M を入力する場所に追加して修正してください。