很抱歉我的新手问题,我很困惑!
出于某些原因,我想制作一个bash脚本。 运行脚本时,我需要传递一些参数。
例如:
script.sh build --with-test --without-test2 --with-test3
script.sh config
script.sh config --with-test3 --without-test2
script.sh config --add this is a test
build
或config
是必需的,其他参数也是可选的,使用参数的顺序并不重要。
我写了这段代码:
if [[ $# -lt 1 ]]; then
printf "build or config parameter is missing"
exit;
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
build )
mode=1
shift
shift
;;
config )
mode=0
shift
shift
;;
-wt2 | --without-test2 )
wt2=0
shift
shift
;;
-wt3 | --with-test3 )
wt3=1
shift
shift
;;
-wt0 | --with-test )
wt0=1
shift
shift
;;
-add | --additional )
additional_command=$2
shift
shift
;;
-h | --help )
help
shift
shift
exit
;;
*)
echo "Missing parameter."
shift
shift
exit
;;
esac
done
但是我的代码无法正常工作,即使没有build
和config
,脚本也可以运行,我无法弄清楚如何编写if语句
答案 0 :(得分:0)
两次使用shift是一个错误。您可以通过检查mode的值来确认已指定config AND / OR构建。附加命令似乎也有问题。
考虑移动shift语句。
我已经在您的程序中添加了一些调试功能,以查看结果:
$ script.sh --with-test --without-test2 --with-test3
additional_command=
mode=
wt0=1
wt2=
wt3=1
如您所见,即使指定了--with-test2,也未设置wt2。
以下是您可以对其进行一些修复的方法:
代码如下:
#!/bin/bash
if [[ $# -lt 1 ]]; then
printf "build or config parameter is missing"
exit;
fi
while [[ $# -gt 0 ]]
do
key="$1"
shift
case $key in
build )
mode=1
;;
config )
mode=0
;;
-wt2 | --without-test2 )
wt2=0
;;
-wt3 | --with-test3 )
wt3=1
;;
-wt0 | --with-test )
wt0=1
;;
-add | --additional )
# Get the rest of the parameters, right?
additional_command=$*
shift $# # Shift to "deplete" the rest of the params
;;
-h | --help )
help
# No need to shift if you are exiting
exit
;;
*)
echo "Missing parameter."
# No need to shift if you are exiting
exit
;;
esac
done
#Here's a little debug code that you can remove or just comment out with :
#Change first line to : cat <<EOF if you want to comment out.
cat <<EOF
additional_command=$additional_command
mode=$mode
wt0=$wt0
wt2=$wt2
wt3=$wt3
EOF
if [ -z "$mode" ] ; then
echo "Missing config or build parameter"
fi