ShellCheckオンライン(スタンドアロンツールとしても利用可能)を使用して、シェルスクリプトを簡単に確認できます。
この場合、ifステートメントにはafter [およびbeforeのスペース]が必要であり、同じ行の;前に(または改行)が必要であることを指摘しますthen。
これを修正すると、USER_NAME何にも初期化されずに使用されていることが通知されます。これはuser_name変数もあるためです(大文字と小文字が区別されます)。同じことが当てはまりますPASSとpass。
また、マングルのread -r停止に使用するように指示します(たとえば、パスワードの場合に重要になる可能性があります)。また、呼び出し時に変数を二重引用符で囲んで、シェルがファイル名のグロビングと単語分割を誤って実行しないようにする必要があります(これも重要です)たとえば、パスワードには、などのファイルグロビング文字やスペースが含まれます)。read\sqlplus*
コードをインデントすると、コードも読みやすくなります。
#!/bin/bash
read -r -p 'please enter username: ' user_name
IFS= read -rs -p 'please enter password: ' pass
printf 'ORACLE_SID = %s\n' "$ORACLE_SID"
sid=$ORACLE_SID
if [ "$sid" = 'Test' ]; then
echo 'Cannot copy' >&2
exit 1
fi
sqlplus -s -l "$user_name/$pass@$sid" <<'SQL_END'
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
SQL_END
ここではIFS、パスワードの読み取り用に一時的に空の文字列を設定することにより、先頭または末尾のスペース文字を含むパスワードを使用できるようにしましたread。
ロジックもあれば救済するように変更されました$ORACLE_SID/です。これにより、スクリプトの主要な操作部分をブランチに配置する必要がなくなります。$sidTestif