我如何比较shell中的2个字符串?

时间:2010-05-23 01:54:01

标签: shell if-statement sh

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

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

显然不起作用 感谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

如果你想要一行(通常它很难阅读):

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

答案 2 :(得分:1)

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

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

-e特有的问题是它在echo中有特殊含义,所以你不可能得到任何回报。如果您尝试echo -e,则会看到没有打印出来的内容,而echo -decho -f会执行您期望的操作。在其旁边放置一个空格,或将其括在括号中,或者在发送到-e时使用其他方式使其不完全echo

答案 3 :(得分: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