3

我希望用户在命令行输入一些东西-l 或-e。所以例如 $./report.sh -e 我想要一个 if 语句来拆分他们做出的任何决定,所以我尝试过......

if [$1=="-e"]; echo "-e"; else; echo "-l"; fi

显然不起作用谢谢

4

4 回答 4

9

我用:

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
于 2010-05-23T01:57:55.583 回答
3

如果您希望将所有内容集中在一行上(通常会让人难以阅读):

if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi
于 2010-05-23T02:02:15.017 回答
1

您需要方括号之间的空格以及其中的内容。此外,只需使用一个=. 你还需要一个then.

if [ $1 = "-e" ]
then
   echo "-e"
else
   echo "-l"
fi

然而,具体的问题-e是它在 中具有特殊含义echo,因此您不太可能得到任何回报。如果你尝试echo -e,你会看到什么都没有打印出来,而echo -decho -f你所期望的。在它旁边放一个空格,或者用方括号括起来,或者有一些其他的方式使它-e在发送到时不完全正确echo

于 2010-05-23T02:07:11.043 回答
1

如果您只想打印用户提交了哪个参数,您可以简单地使用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
于 2010-12-14T09:07:39.983 回答