データベースクエリを実行し、結果をcsvファイルにリダイレクトするスクリプトがあります。このファイルはsftpを使用してアップロードした後、次のように削除されます。
FileName=` echo "report_$StartDate:$StopDate.csv" | sed 's/\ /_/g'`
$DatabaseCommand "$Query" -f CSV | sed 's/"//g' > "$ReportDir/$FileName"
expect<<EOD
set timeout 3600
spawn sftp $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $ReportDir/$FileName\r"
expect "sftp>"
send "bye\r"
EOD
rm -rf $ReportDir/$FileName
私は最後の行をに変更する必要があることを知っていますが、rm -f
bashがFileName行に混在して次のことを実行できるかどうか疑問に思います。
rm -rf $ReportDir/
ベストアンサー1
このようなコマンドを使用すると、何が起こっても変数が空になるのを防ぎます。
$ cat foo.sh
#!/bin/bash
ReportDir=/somepath
FileNam=$(echo ...) # oops, a typo
# ...
rm -rf -- "${ReportDir:?}/${FileName:?}"
$ bash -x foo.sh
+ ReportDir=/somepath
++ echo ...
+ FileNam=...
foo.sh: line 5: FileName: parameter null or not set
空または設定されていない場合、拡張機能は${parameter:?message}
エラーで終了します。parameter
デフォルトのメッセージは通常大丈夫なので、上記のコードではメッセージを提供していません。
または手動で確認してください。しかし、これは冗長で、まだタイプミスが発生しやすいです。
if [ -z "$FileName" ] ; then
echo "FileName is empty!" >&2
exit 1
fi
rm -rf -- "$ReportDir/$FileName"