Для следующего сценария оболочки -

#!/bin/sh
main_version=0
feature_version=0
patch_version=0
if [[ $1 -eq "m" ]]; then
    main_version=$((main_version+1))
fi

if [[ $1 -eq "f" ]]; then
    feature_version=$((feature_version+1))
fi

if [[ $1 -eq "p" ]]; then
    patch_version=$((patch_version+1))
fi

echo $main_version
echo $feature_version
echo $patch_version

Он приращение всех переменный , даже если я прохожу m в качестве аргумента , используя ./<script-name>.sh m

В чем причина этого?

1 ответ1

4

-eq использует арифметическое сравнение. Арифметические операции обрабатывают нечисловые операнды как 0, поэтому вы просто проверяете [[ 0 -eq 0 ]] во всех трех случаях.

Для сравнения строк вы хотите вместо этого [ "x" = "y" ] . (Это синтаксис оболочки POSIX.)

Синтаксис Bash [[ x == y ]] с двойным =, но не рекомендуется использовать bashisms/kshisms, когда заголовок вашего скрипта объявляет /bin /sh. Либо измените заголовок, чтобы он требовал Bash, либо придерживайтесь только синтаксиса оболочки POSIX.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .