bash确定变量是否为空,如果是,则退出。

时间:2013-11-07 14:11:52

标签: bash if-statement md5

我正在尝试执行此操作: 我有一个测试文件,其中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

6 个答案:

答案 0 :(得分:21)

我更喜欢的答案是

[[ -z "$1" ]] && { echo "Parameter 1 is empty" ; exit 1; }

答案 1 :(得分:14)

检查变量是否为空的一种方法是:

if [ "$var" = "" ]; then
    # $var is empty
fi

另一个更短的选择是:

[ "$var" ] || # var is empty

答案 2 :(得分:3)

您可以使用简短形式:

FNAME="$I_IDOCMD5"
: ${FNAME:="$I_LEGALMD5"}
: ${FNAME:="$I_ZIPMD5"}
: ${FNAME:?"Usage: $0 filename"}

在这种情况下,如果没有声明任何I_...变量,脚本将退出,打印一个错误消息,前面跟着触发消息的shell脚本行。

abs-guide中查看更多内容(搜索“示例10-7”)。

答案 3 :(得分:2)

在bash中,你可以使用public class Stack <E> { private StackItem<E> currTop; private int size; private int max; private static class StackItem<E> { private E e; private StackItem<E> next; } public Stack(int max) { currTop = null; size = 0; this.max = max; } public void add(E e){ if ((size+1) == max) throw new StackOverflowError("Max items in stack is reached"); StackItem<E> old = currTop; currTop = new StackItem<>(); currTop.e = e; currTop.next = old; size++; } public E getFirst() { if (currTop == null) return null; E output = currTop.e; currTop = currTop.next; size --; return output; } public E showFirst() { return currTop.e; } public int getSize() { return size; } } 导致bash在失败的参数扩展时退出。

来自bash man(关于set -u内置的部分):

  

-u
  执行参数时,将特殊参数“@”和“*”以外的未设置变量和参数视为错误   扩张。如果尝试对未设置的变量进行扩展或   参数,shell打印错误消息,如果不是交互式,   以非零状态退出。

有关更多信息,我推荐这篇文章: http://redsymbol.net/articles/unofficial-bash-strict-mode/

答案 4 :(得分:1)

首先只测试这个(只是缩小范围):

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\""

答案 5 :(得分:0)

“如果变量为空,则表示sftp服务器上没有文件”

如果sftp服务器上没有文件, 变量,那么真的为空?

没有隐藏的空间或类似的东西?或数字零(计为非空)?