Как сравнить 2 строки в оболочке? - PullRequest
3 голосов
/ 23 мая 2010

Я хочу, чтобы пользователь что-то вводил в командной строке -l или -e. так, например $. / report.sh -e Я хочу, чтобы заявление if делило любое принятое ими решение, поэтому я попытался ...

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

, очевидно, не работает, хотя Спасибо

Ответы [ 4 ]

9 голосов
/ 23 мая 2010

Я использую:

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
3 голосов
/ 23 мая 2010

Если вы хотите все это в одной строке (обычно это затрудняет чтение):

if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi
1 голос
/ 14 декабря 2010

Если вы просто хотите напечатать, какой параметр отправил пользователь, вы можете просто использовать 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
1 голос
/ 23 мая 2010

Вам нужны пробелы между квадратными скобками и тем, что внутри них.Кроме того, просто используйте один =.Вам также нужен then.

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

Однако проблема, характерная для -e, заключается в том, что он имеет особое значение в echo, поэтому вы вряд ли что-нибудь получите обратно.Если вы попробуете echo -e, вы ничего не увидите, а echo -d и echo -f сделают то, что ожидаете.Поставьте рядом с ним пробел, или заключите его в квадратные скобки, или используйте другой способ сделать его не совсем -e при отправке на echo.

...