在我的脚本中,我有以下内容:
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,它仍然会像在调试模式下一样运行。知道为什么吗?
答案 0 :(得分:3)
此if [ $DEBUG=="YES" ]; then
不正确。您需要==
周围的空格。
像if [ $DEBUG == "YES" ]; then
一样。
将所有内容放在一起的方式意味着[
只能看到一个参数,而[
/ test
的一个参数会被解释为{{1}测试一个非空字符串([ -n word ]
与==YES
的值无关。
尽管如此,你没有在任何地方使用$DEBUG
的论据,你应该选择-d
/ false
或true
/ {{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