我正在尝试执行此操作:我有一个测试文件,其中 MD5sum 的文件位于 SFTP 上。变量应包含 md5sum(字符串),如果变量为空,则表示 SFTP 服务器上没有文件。我正在尝试这段代码,但它不起作用。
if [ -z $I_IDOCMD5 ] || [ -z $I_LEGALMD5 ] || [ -z $I_ZIPMD5 ]
then
echo "ERROR: At least one file not present of checksum missing no files will be deleted" >>$IN_LOG
ERRORS=$ERRORS+2
else
if [[ $I_IDOCMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/idoc/$I_IDOC) ]]
then
echo "rm IDOC/$I_IDOC" >/SAP/commands_sftp.in
else
echo "problem with checksum"
ERRORS=$ERRORS+2
fi
if [[ $I_LEGALMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/legal/$I_LEGAL) ]]
then
echo "rm LEGAL/$I_LEGAL" >>/SAP/commands_sftp.in
else
echo "problem with checksum"
ERRORS=$ERRORS+2
fi
if [[ $I_ZIPMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/zip/$I_ZIP) ]]
then
echo "rm ZIP/$I_ZIP" >>/SAP/commands_sftp.in
else
echo "problem with checksum"
ERRORS=$ERRORS+2
fi
我更喜欢的答案是以下
[[ -z "$1" ]] && { echo "Parameter 1 is empty" ; exit 1; }
注意,不要忘记在每条指令后;
{}
检查变量是否为空的一种方法是:
if [ "$var" = "" ]; then
# $var is empty
fi
另一个更短的替代方案是这样的:
[ "$var" ] || # var is empty
在 bash 中,您可以使用set -u
,它会导致 bash 在参数扩展失败时退出。
来自 bash man(关于内置set
部分):
-u
执行参数时,将特殊参数"@"和"*"以外的未设置变量和参数视为错误 扩张。如果尝试对未设置的变量进行扩展,或者 参数,shell 将打印一条错误消息,如果不是交互式的, 以非零状态退出。
有关更多信息,我推荐这篇文章:http://redsymbol.net/articles/unofficial-bash-strict-mode/
您可以使用简短形式:
FNAME="$I_IDOCMD5"
: ${FNAME:="$I_LEGALMD5"}
: ${FNAME:="$I_ZIPMD5"}
: ${FNAME:?"Usage: $0 filename"}
在这种情况下,如果未声明任何I_...
变量,脚本将退出,并打印一条错误消息,前面加上触发该消息的 shell 脚本行。
在abs指南中查看更多相关信息(搜索«示例10-7»)。
首先只测试这个(只是为了缩小范围):
if [ -z "$I_IDOCMD5" ] || [ -z "$I_LEGALMD5" ] || [ -z "$I_ZIPMD5" ]
then
echo "one is missing"
else
echo "everything OK"
fi
echo ""$I_IDOCMD5""
echo ""$I_LEGALMD5""
echo ""$I_ZIPMD5""
"如果变量为空,则表示 SFTP 服务器上没有文件"
如果 sftp 服务器上没有文件,那么变量真的是空吗?
没有隐藏空格或类似的东西? 或数字零(算作非空)?