2017-07-22 19 views
1

シェルスクリプト関数で次の匿名ブロックを実行しているときにファイルを生成しようとしています。私はその機能の一部だけを再現しています。 コードはです。シェルスクリプトのエコー内のパラメータを表示

echo " sqlplus -s $user_name/$password << EOF" 
echo "set serveroutput on" 
echo "set echo on" 
echo "WHENEVER SQLERROR EXIT SQL.SQLCODE" 
echo "declare" 
echo "  l_workspace_id number;" 
echo "  l_workspace_name varchar2(100) := '$workspace_name';" 
echo "  l_application_id number := $application_id;" 
echo "  l_parsing_schema varchar2(100) := '$user_name';" 
echo "begin" 
echo " select workspace_id into l_workspace_id" 
echo "  from apex_workspaces" 
echo "where upper(workspace) = upper(l_workspace_name);" 
echo "" 
echo " apex_application_install.set_workspace_id(l_workspace_id);" 
echo " apex_application_install.set_application_id(l_application_id);" 
echo " apex_application_install.generate_offset;" 
echo " apex_application_install.set_schema(l_parsing_schema);" 
echo " apex_application_install.set_application_alias('F' || apex_application_install.get_application_id);" 
echo "end;" 
echo "/" 
echo "@f$APPLICATIONID.sql" 
echo "commit;" 
echo "exit;" 
echo "EOF" 

このエコーは別のシェルスクリプトファイルに出力されます。私は.SHファイルをチェックしていたときに問題がある、私は次の出力

sqlplus -s/<< EOF 
set serveroutput on 
set echo on 
WHENEVER SQLERROR EXIT SQL.SQLCODE 
declare 
    l_workspace_id number; 
    l_workspace_name varchar2(100) := ; 
    l_application_id number := ; 
    l_parsing_schema varchar2(100) := ; 

私は空白として来ている$を保ったすべての場所を取得しています生成されました。私が間違っているところを教えてくれる人もいますか?

ありがとうございました。

答えて

3

これらの行がechoになると、変数はその値に展開されます。 しかしそれはあなたがしたくないことです。 生成されたスクリプトを実行するときに、後で変数を展開する場合は にします。 はそれを行うには、次のものが必要に次のいずれか

  • エスケープすべて$変更全てecho "..."echo '...'に、$が展開されないように、単一引用符と二重引用符を置き換える
  • \$

第三、より良いオプションは、このような"..."で囲まれたラベルでヒアドキュメントを使用することです3210

cat << "OUTER" 
sqlplus -s $user_name/$password << EOF 
set serveroutput on 
set echo on 
WHENEVER SQLERROR EXIT SQL.SQLCODE 
declare 
     l_workspace_id number; 
     l_workspace_name varchar2(100) := '$workspace_name'; 
     l_application_id number := $application_id; 
     l_parsing_schema varchar2(100) := '$user_name'; 
begin 
    select workspace_id into l_workspace_id 
     from apex_workspaces 
where upper(workspace) = upper(l_workspace_name); 

    apex_application_install.set_workspace_id(l_workspace_id); 
    apex_application_install.set_application_id(l_application_id); 
    apex_application_install.generate_offset; 
    apex_application_install.set_schema(l_parsing_schema); 
    apex_application_install.set_application_alias('F' || apex_application_install.get_application_id); 
end; 
/
@f$APPLICATIONID.sql 
commit; 
exit; 
EOF 
OUTER 
関連する問題