如何在Shell中比较两个字符串?

3

我希望用户在命令行输入-l或-e。 例如:$./report.sh -e 我想要一个if语句来分割他们所做的任何决定,因此我尝试了...

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

显然这并没有起作用。谢谢。
4个回答

10

我使用:

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

你说“getopt”和“getopts”。它们是两个不同的东西。前者是一个独立的可执行文件,而后者是一个shell内置命令。 - Dennis Williamson

3
如果您希望所有内容都在一行上(通常会使阅读变得困难):
if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi

1

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

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

-e 的问题在于它在 echo 中有特殊含义,因此你不太可能得到任何返回值。如果你尝试使用 echo -e,你将看不到任何输出,而 echo -decho -f 则会按照你的预期工作。在其旁边加上一个空格,或用括号括起来,或者通过其他方式使其不完全等同于 -e,以便在发送给 echo 时避免出现问题。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接