在 bash 脚本中测试 truth/falseness

Testing truth/falseness in bash script

出于某种原因,我不知道如何在 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: [=12=] [-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 标志?

很可能是打字错误:

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

这应该是

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

你特地询问了测试true/false。这些是语言内置的而不是使用字符串,并且您不需要 [[ 测试。以下是我的写法:

#!/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: [=10=] [-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