我希望用户在命令行输入-l或-e。 例如:$./report.sh -e 我想要一个if语句来分割他们所做的任何决定,因此我尝试了...
if [$1=="-e"]; echo "-e"; else; echo "-l"; fi
显然这并没有起作用。谢谢。
我希望用户在命令行输入-l或-e。 例如:$./report.sh -e 我想要一个if语句来分割他们所做的任何决定,因此我尝试了...
if [$1=="-e"]; echo "-e"; else; echo "-l"; fi
我使用:
if [[ "$1" == "-e" ]]; then
echo "-e"
else
echo "-l";
fi
然而,对于解析参数来说,getopts
可能会让你的生活更轻松:
while getopts "el" OPTION
do
case $OPTION in
e)
echo "-e"
;;
l)
echo "-l"
;;
esac
done
if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi
方括号和其中的内容之间需要空格。此外,只需使用单个=
。您还需要一个then
。
if [ $1 = "-e" ]
then
echo "-e"
else
echo "-l"
fi
-e
的问题在于它在 echo
中有特殊含义,因此你不太可能得到任何返回值。如果你尝试使用 echo -e
,你将看不到任何输出,而 echo -d
和 echo -f
则会按照你的预期工作。在其旁边加上一个空格,或用括号括起来,或者通过其他方式使其不完全等同于 -e
,以便在发送给 echo
时避免出现问题。
如果您只想打印用户提交的参数,可以简单地使用echo "$1"
。如果您希望在用户没有提交任何内容时返回默认值,则可以使用echo "${1:--l}
(:-
是Bash语法中的默认值)。但是,如果您想要真正强大和灵活的参数处理,可以考虑使用getopt
:
params=$(getopt --options f:v --longoptions foo:,verbose --name "my_script.sh" -- "$@")
if [ $? -ne 0 ]
then
echo "getopt failed"
exit 1
fi
eval set -- "$params"
while true
do
case $1 in
-f|--foo)
foobar="$2"
shift 2
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
while [ -n "$3" ]
do
targets[${#targets[*]}]="$2"
shift
done
source_dir=$(readlink -fn -- "$2")
shift 2
break
;;
*)
echo "Unhandled parameter $1"
exit 1
;;
esac
done
if [ $# -ne 0 ]
then
error "Extraneous parameters." "$help_info" $EX_USAGE
fi