考慮する:
#!/bin/ksh
db2 connect to MKTETLPS user ....... using ........
db2 "select count(*) from etl.IDM_COLLAPSE_ORG_DEE c where c.IDM_PROCESS_STEP = 'I' and priority in ( '1','2','3','4','5') and c.update_ts < (current timestamp - 60 minutes) with ur" > l.txt
$a = /is115/idm/dsproj/scripts/l.txt
if [ $a -gt 0 ];
then
db2 "update etl.idm_collapse_org_dee
set idm_process_step = NULL where priority in (
'1','2','3','4','5')
and idm_process_step ='I'"
else
echo "All is well"
fi
上記のスクリプトを実行していますが、次のエラーが発生します。どうすれば解決できますか?
./CORCleanup1.sh[8]: =: not found.
./CORCleanup1.sh[10]: test: 0403-004 Specify a parameter with this command.
All is well
DB20000I The SQL command completed successfully.
DB20000I The TERMINATE command completed successfully.
db2 connect reset
db2 terminate
exit
答え1
変数の割り当てには、$
および周囲のスペースを含めないでください=
。私もその課題を二重引用します。したがって、変数の割り当ては次のようにする必要があります。
a="/is115/idm/dsproj/scripts/l.txt"
スクリプトをよく読むと、ファイルパス自体ではなく1.txt
ファイルの内容を保存したいようです。$a
これを行うには、次のようにタスクを使用できます。
read -r a < /is115/idm/dsproj/scripts/l.txt
(read -r
ファイルの最初の行を読み、先行するスペースとタブを削除し(デフォルトと仮定$IFS
)、指定された変数に保存します)
$a
ステートメントで変数を二重引用符で指定することもできますif
。
if [ "$a" -gt 0 ];
また、使用することができますhttps://www.shellcheck.net/スクリプトの構文を確認してください。
答え2
これがこのエラーが表示される理由です。
$a = /is115/idm/dsproj/scripts/l.txt
コードのこの時点では、変数はa
まだ設定されていません。 ksh は変数を空の文字列に置き換えて、次のような結果を得る。
= /is115/idm/dsproj/scripts/l.txt
その後、kshはその行を実行しようとし、コマンドを見つけようとし、見つから=
ず、表示される最初のエラーを生成します。
@Thomasが指摘したように、変数割り当て構文は次のとおりです。
varname=value
$
左側には何もなく、その周りには空白もありません=
。https://www.shellcheck.net/これらのエラーは指摘されます。
それではそこにいます。
if [ $a -gt 0 ];
値がないため、a
kshは置換を実行して実行しようとします。
if [ -gt 0 ];
コマンド[
(例:エイリアス付きコマンド)は、左のオペランドを持たない演算子をtest
理解しておらず、2番目のエラーメッセージが表示されます。‑gt
コマンド[
がゼロ以外の状態で終了すると、ステートメントはこのブロックをif
実行し、else
「すべてが正常です」というメッセージが表示されます。
そのため、単一の括弧内にすべての変数を引用することが重要です。[ ... ]
if [ "$a" -gt 0 ];
より一般的には、引用符を省略する時期を明示的に知らない限り、変数は常に引用符で囲まれます。また、見ることができますbash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク