Shell komut dosyalarınızı çevrimiçi olarak ShellCheck (bağımsız bir araç olarak da kullanılabilir) kullanarak kolayca kontrol edebilirsiniz .
Bu durumda, if-ifadesinin [
önce ]
ve sonra boşluklara ihtiyaç duyduğunu ve aynı satırdan ;
önce bir (veya bir yeni satıra) ihtiyacınız olduğunu gösterecektir then
.
Bunu düzelttiğinizde, USER_NAME
hiçbir şeye başlatılmadan kullanıldığını size söyleyecektir . Bunun nedeni bir user_name
değişkeninizin de olması (büyük / küçük harf önemlidir). Aynı şey PASS
ve için de geçerlidir pass
.
Ayrıca , mangling (örneğin şifreler için önemli olabilir) read -r
durdurmak için kullanmanız ve kabuğun yanlışlıkla dosya adı globbing ve kelime bölme yapmasını önlemek için arama yaparken değişkenleri iki kez alıntı yapmanız gerektiğini söyler (yine bu önemlidir parola, örneğin, boşluk veya boşluklar gibi dosya globbing karakterleri içerir ).read
\
sqlplus
*
Kodu girintilemek de kodu daha okunabilir hale getirir:
#!/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
Burada ayrıca IFS
, parola okumak için geçici olarak boş bir dizeye ayarlayarak önde gelen veya sondaki boşluk karakterlerine sahip şifreleri kullanmayı mümkün kıldım read
.
Mantık, eğer $ORACLE_SID
/ $sid
ise kefaletle değiştirilecek şekilde değiştirildi Test
. Bu, betiğin ana operasyonel bölümünün bir if
dalda olmasını önler .