开关不工作

时间:2014-10-24 14:06:33

标签: linux bash shell

在我的脚本中,我有以下内容:

DEBUG="false"
while getopts ":d:" opt; do
      case $opt in
        d)
          $BIN_ECHO -e "DEBUG MODE ENABLED WITH $OPTARG" >&2
          DEBUG="YES"
          ;;
        \?)
          $BIN_ECHO -e "Invalid option: -$OPTARG" >&2
          exit 1
          ;;
        :)
          $BIN_ECHO -e "Option -$OPTARG requires an argument." >&2
          exit 1
          ;;
      esac
    done

但是,每次运行它时,DEBUG = false似乎都没有优先考虑。

我有这个例子:

if [ $DEBUG=="YES" ]; then
    $BIN_ECHO -e "SETTING LOCATION TO /USR/SRC"
fi
cd /usr/src

即使我不在脚本上使用-d,它仍然会像在调试模式下一样运行。知道为什么吗?

3 个答案:

答案 0 :(得分:3)

if [ $DEBUG=="YES" ]; then不正确。您需要==周围的空格。

if [ $DEBUG == "YES" ]; then一样。

将所有内容放在一起的方式意味着[只能看到一个参数,而[ / test的一个参数会被解释为{{1}测试一个非空字符串([ -n word ]==YES的值无关。

尽管如此,你没有在任何地方使用$DEBUG的论据,你应该选择-d / falsetrue / {{1作为你的配对。

答案 1 :(得分:2)

你犯了一个间距错误。测试的内容是:

if [ false==YES ] ; then

请记住,shell在执行命令之前会扩展变量。所以你所做的相当于

if [ any_old_random_string_with==in_it ] 

...总是会评估为“true”,它会为您提供您所看到的行为。

你只需要这样做:

if [ "$DEBUG" == "YES" ] ; then

答案 2 :(得分:1)

脚本中getopts用法错误。

getopts ":d:" opt

:后的d表示值与-d选项一起传递为

./yourscript -d value

情况并非如此。将:删除为

getopts ":d" opt

DEBUG="false"
while getopts ":d" opt; do
      case $opt in
        d)
          $BIN_ECHO -e "DEBUG MODE ENABLED WITH $OPTARG" >&2
          DEBUG="YES"
          ;;
        \?)
          $BIN_ECHO -e "Invalid option: -$OPTARG" >&2
          exit 1
          ;;
        :)
          $BIN_ECHO -e "Option -$OPTARG requires an argument." >&2
          exit 1
          ;;
      esac
    done

使用-d选项

调用脚本

./yourscript -d

现在将生成输出

DEBUG MODE ENABLED WITH 
SETTING LOCATION TO /USR/SRC