代码之家  ›  专栏  ›  技术社区  ›  Glen Solsberry

bash within if[];块

  •  0
  • Glen Solsberry  · 技术社区  · 15 年前

    我有代码匹配:

    if [ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]; then
        wget $WGET_OPTS $BASE$i
        LAST_MODIFIED=`echo "\`date +%s\` - \`stat -c %Y $i\`" | bc`
        if [ $LAST_MODIFIED -lt 500 ]; then
            $FILES_MODIFIED++
        fi
    fi
    

    $i 通过定义

    for i in `/bin/grep ".gz" index.html | awk -F\" '{print $2}'`
    

    但是,巴什告诉我

    [: missing `]'
    

    -f: command not found

    为什么?

    5 回复  |  直到 15 年前
        1
  •  4
  •   dave4420    15 年前

    应该是

    if [ $LAST_MODIFIED -lt 3600 ] || ! [ -f "$i" ]; then
    

    [ (和) ! )是外壳内置的。它们不是 if .

        2
  •  9
  •   Mark Byers    15 年前

    你应该使用 [[ ... ]] 而不是 [ ... ] 或使用 -o 而不是 || .

    if [[ $LAST_MODIFIED -lt 3600 || ! -f "$i" ]]; then
    

    或:

    if [ $LAST_MODIFIED -lt 3600 -o ! -f "$i" ]; then
    

    请参见这里: http://www.ibm.com/developerworks/library/l-bash-test.html

        3
  •  1
  •   Rickard    15 年前

    尝试将if重写为

    if [ cond a ] || [ cond b ]; then
    ...
    fi
    
        4
  •  0
  •   John Weldon    15 年前

    [ 是一个实际的内置命令,它需要 ] 因为这是最后一个论点。

    然而,您的语法使最后一个参数 [ 3600 “,然后启动新命令..

    尝试在 [ ] 一个命令。

        5
  •  0
  •   Jim Dennis    15 年前

    记住,那次狂欢 [ 内置命令必须符合外部命令的语法要求 /bin/[ 命令(通常是指向 /bin/test )为了保持与sh的旧版本的向后兼容性,其中 test ( [ )不是外壳内部的。

    为了满足这一级别的兼容性,解析器必须将作为新命令的分隔符,从而终止 [ 命令。什么时候? BIN/检验 称为 [ (它检查argv[0]上的值),然后需要关闭“]”作为参数。

    在测试中使用-o(或)( [ )命令。

    (就个人而言,我认为使用 [ 形式 测试 正是因为这个原因。新手会把它看作一种句法特征…一种条件表达式构造 if 语句,要求语义与其作为命令的实现不一致。所以我教它 测试 即使我(有时)把它当作 [ 因为这种做法很普遍。