LINUX.ORG.RU

Bash: проверка наличия аргументов

 


0

2

Здравствуйте, подскажите пожалуйста что я делаю не так:

if [[ $1 -eq 'main' ]]
	then
	echo "123"
fi
if [[ $1 -eq 'test' ]]
	then
	echo "321"
fi
при выполнении условия не срабатывают, вернее срабатывают оба, в независимости от вводимых аргументов

-eq это арифметический оператор, который сравнивает числа.

surefire ★★★
()

Про сравнение сказали, дополню еще что вместо if тут уместнее case.

alozovskoy ★★★★★
()
Ответ на: комментарий от Black_Shadow

Спасибо всем за помощь, уже гугланул в сторону case и добавил в выражение *) echo «111»;; для обработки ошибок

VVSLawyer
() автор топика

Про сравнение и case сказали, дополню еще что в bash нет необходимости заключать строковый литерал в кавычки.

$1 == main
echo test
вполне корректно.

ashot ★★★★
()

Рекомендую также, во-первых, всегда брать аргумент в двойные кавычки на случай пустой строки или строки с разделителями, а во-вторых, ставить нормальную константную строку первым аргументом или дописывать и туда и туда какой-нибудь символ спереди (как правило, используется x), чтобы не получилась фигня, когда у тебя аргумент твоей программы (то бишь $1) может сойти за аргумент [[ (например, -n). Итого что-то типа

if [[ "x$1" = "xmain" ]]
    then
    echo "123"
fi

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

Рекомендую также, во-первых, всегда брать аргумент в двойные кавычки на случай пустой строки или строки с разделителями

Команды [[ и [ (test) очень сильно разные.

чтобы не получилась фигня, когда у тебя аргумент твоей программы (то бишь $1) может сойти за аргумент [[

Можно поподробнее, что имеется ввиду?

n=[[; if [[ $n == [[ ]]; then echo 123; fi

ashot ★★★★
()
Ответ на: комментарий от mky

я решил попробовать вот так и вроде работает, ужасно костыльно или норм ?

case "$1" in
        "main" )
                case "$2" in
                        "start"   ) echo "start"  ;;
                        "stop"    ) echo "stop"  ;;
                        "restart" ) echo "restart"  ;;
                        "save"    ) echo "save"  ;;  
                        *         ) echo "err" ;;
                esac
                ;;
        *      )
                echo 'err'         
               ;;
esac

VVSLawyer
() автор топика
Ответ на: комментарий от tiandrey

когда у тебя аргумент твоей программы (то бишь $1) может сойти за аргумент [[

Это невозможно. У [[ нет аргументов, ибо это не команда, а синтаксическая конструкция. Ваш совет не вредный, но бестолковый.

Zmicier ★★★★★
()
Ответ на: комментарий от VVSLawyer

В твоем конкретном случае можно и так:

if [[ $# -eq 2 && $1 == main ]]; then
    case "$2" in
        start ) echo start;;
         stop ) echo stop;;
      restart ) echo restart;;
         save ) echo save;;  
            * ) echo err;;
    esac
else
    echo err
fi

ashot ★★★★
()
Ответ на: комментарий от ashot

в bash нет необходимости заключать строковый литерал в кавычки

$ a="abc def"
$ [ $a == "abc def" ] && echo ok
bash: [: слишком много аргументов

Без кавычек небезопасно. А вот если $a заключить в кавычки, то всё работает:

[ "$a" == "abc def" ] && echo ok
ok

Black_Shadow ★★★★★
()
Последнее исправление: Black_Shadow (всего исправлений: 1)
Ответ на: комментарий от Black_Shadow

Будь внимательнее. Я выше писал, что [ и [[ не одно и тоже.

ashot ★★★★
()
Ответ на: комментарий от Black_Shadow

И строковый литерал у тебя «ok» в

echo ok
, а не переменная.

ashot ★★★★
()
Ответ на: комментарий от Zmicier

Ok, значит с башевским [[ всё в порядке. В случае с test ([) всё в силе, я ж не просто так написал, был уже опыт борьбы с непонятными ошибками [ как раз из-за сравнения строк, где у первого аргумента первый символ '-'.

P.S. на своём ноуте проверил - не воспроизводится; ошибка была на дебиановском софте.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.