在 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
出于某种原因,我不知道如何在 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