在shell脚本中,在while循环中读取文件后无法访问外部变量

时间:2018-06-07 17:12:14

标签: shell sh

#!/bin/sh
# Read in classpath
if [ x"${JAVA_CLASSPATH}" != x ]; then
    classpath="${JAVA_CLASSPATH}"
else
    classpath=""
    while read file; do
        classpath="${classpath}:${JAVA_APP_DIR}/lib/$file"
    done < ${JAVA_APP_DIR}/lib/classpath
fi
echo classpath is ${classpath}

我试图通过读取文件来构建类路径,但是在while循环之外无法访问类路径变量。请指定一种在while循环外访问classpath变量的方法.echo语句的结果。

echo : classpath is 

PS:我看到了与此类似的其他问题,我没有使用这些问题中提到的任何管道。我的代码反映了为这些问题指定的答案,但我仍然面临着这个问题。这也是一个shell脚本而不是bash。

1 个答案:

答案 0 :(得分:0)

很可能${JAVA_APP_DIR}/lib/classpath不存在。

比较以下两个相似的代码位(仅第一行不同),在符合 POSIX dash shell下进行测试:

  1. 输入文件 dummyfile 存在。

    echo baz > dummyfile
    unset foo
    if false
    then : 
    else while [ -z "$foo" ] ; do
             foo="bar"
         done < dummyfile
    fi
    echo "=$foo="
    

    输出:

    =bar=
    
  2. 输入文件 dummyfile 不存在。

    rm -f dummyfile
    unset foo
    if false
    then : 
    else while [ -z "$foo" ] ; do
             foo="bar"
         done < dummyfile
    fi
    echo "=$foo="
    

    输出:

    dash: 65: cannot open dummyfile: No such file
    ==
    

    while循环的内容从未运行过。

  3. 请注意,代码有点奇怪:

    • while循环始终运行并退出,因为$foounset然后重置。

    • done < dummyfile,但没有read从中输入任何内容。然而,即使没有read命令,该文件的存在与<重定向相结合,也决定了$foo是否已设置。

    • 即使是空文件也可以:

      unset foo
      if false
      then : 
      else while [ -z "$foo" ] ; do
               foo="bar"
           done < /dev/null
      fi
      echo "=$foo="