【问题标题】:Testing truth/falseness in bash script在 bash 脚本中测试真/假
【发布时间】:2015-07-02 06:44:10
【问题描述】:

由于某种原因,我不知道如何在 bash 中测试真相:

#!/bin/bash
FORCE_DELETE=""
BE_VERBOSE=""

OPTIND=1
while getopts ":fv" FLAG "$@" ; do

    if [[ "$FLAG" == "f" ]] ; then
        FORCE_DELETE="true"
    fi
    if [[ "$VALUE" == "v" ]] ; then
        BE_VERBOSE="true"
    fi

    if [[ "$FLAG" == "?" ]] ; then
        echo "Usage: $0 [-fv] file ..."
        exit 1
    fi
done

shift `expr $OPTIND - 1`

if [[ "$FORCE_DELETE" == "true" && "BE_VERBOSE" == "true" ]] ; then
  echo "FORCE_DELETE AND BE_VERBOSE $@" 
elif [[ "$FORCE_DELETE" == "true" ]] ; then
  echo "FORCE_DELETE $@" 
elif [[ "$BE_VERBOSE" == "true" ]] ; then
  echo "BE_VERBOSE $@" 
else
  echo "$@"
fi

exit 0

成绩单:

$ test a b  
a b  
$ test -f a b  
FORCE_DELETE a b  
$ test -v a b  
a b  
$ test -fv a b  
FORCE_DELETE a b  

为什么我的 bash 脚本响应 -f 标志而不响应 -v 标志?

【问题讨论】:

  • 您在第一个if 中缺少BE_VERBOSE 之前的$
  • 是错字吗? [[ "$VALUE" == "v" ]],这不应该是[[ "$FLAG" == "v" ]]
  • @CarlNorum 其实iamauser的评论更贴切。
  • 所有问题都只是小错别字,这个问题应该直接关闭。
  • 啊,太尴尬了……测试后会修正错别字和编辑问题。

标签: macos bash shell sh


【解决方案1】:

很可能是错字:

[[ "$VALUE" == "v" ]], 

这应该是

[[ "$FLAG" == "v" ]] 

【讨论】:

    【解决方案2】:

    您特别询问有关测试真/假的问题。这些是语言内置的,而不是使用字符串,您不需要[[ 测试。我会这样写:

    #!/bin/bash
    force_delete=false         # Don't use UPPERCASE
    be_verbose=false           # they could collide with reserved variables
    
    # OPTIND does not need to be initialised
    while getopts :fv flag
    do
        # appears one of your if statements is incorrect
        # a case is often used with getopts
        case $flag in
        f) force_delete=true
           ;;
        v) be_verbose=true
           ;;
        \?) echo "Usage: $0 [-fv] file ..."
            exit 1
            ;;
        esac
    done
    
    shift $((OPTIND-1))  # don't create a child process for simple arithmetic   
    
    if $force_delete && $be_verbose
    then
        echo "force_delete AND be_verbose $@"
    elif $force_delete
    then
        echo "force_delete $@"
    elif $be_verbose
    then
        echo "be_verbose $@"
    else
        echo "$@"
    fi
    
    # Bash exits 0 by default
    

    【讨论】:

    • 在while循环中,;;的作用是什么?
    • @mchenja:;; 终止case 语句中的每个代码块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2015-07-25
    • 2016-04-20
    相关资源
    最近更新 更多