ksh で SQL クエリの出力を追加すると出力が壊れる

ksh で SQL クエリの出力を追加すると出力が壊れる

私はスクリプト作成の初心者です。例えば、以下の 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 -vecho $mdate | cat -vEXE、Cygwin のような環境で実行していると思われますが、この環境ではキャリッジ リターンが追加されている可能性があります。control mdate=${mdate//^M/}-v、control-m と入力して、^M を入力する場所に追加して修正してください。

関連情報