У меня есть базовая проверка равенства строк в сценарии Bash, но результат не такой, как ожидалось.
Для воспроизведения скопируйте приведенный ниже код в исполняемый файл (называемый «развертыванием» в моих примерах ниже).
#!/bin/bash
echo $1
if [[ "$1" -eq "--help" ]] || [[ "$1" -eq "-h" ]]; then
echo "hello"
fi
Если я запускаю скрипт так:
./deploy -h
Результат:
-h
hello
Если я запускаю скрипт так:
./deploy --help
Результат:
-help
Почему условное утверждение не принимает значение true?





-eq сравнивает целые числа. Используйте == или = для сравнения строк.
if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
echo "hello"
fi
Вы можете опустить кавычки. Расширения переменных в левой части == безопасны при использовании двойных скобок.
Вы также можете использовать || внутри скобок. Это невозможно сделать с одинарными скобками, но двойные скобки — это синтаксическая функция со специальными правилами синтаксического анализа, которые это позволяют.
if [[ $1 == --help || $1 == -h ]]; then
echo "hello"
fi
Если это становится более сложным, вы также можете рассмотреть блок case.
case $1 in
-h|--help)
echo "hello";;
esac
If
-eqis for numerical comparison, how come./deploy -hworked as expected?
Арифметическая оценка обычно выводит сообщение об ошибке, когда ей даются недопустимые выражения, но так получилось, что две строки, которые вы просите оценить, синтаксически допустимы.
-h инвертирует значение неопределенной переменной $h. Результат 0.--help уменьшает неопределенную переменную $help. Результат - -1.Попробуйте ввести недопустимую строку, и вы получите сообщение об ошибке.
$ ./deploy 'foo bar'
bash: [[: foo bar: syntax error in expression (error token is "bar")
$ ./deploy @
bash: [[: @: syntax error in expression (error token is "@")
Он также помечен bash, имеет шебанг #!/bin/bash и использует [[.
Возможный дубликат Как сравнить строки в Bash, Как сравнить две строковые переменные в операторе if в Bash? и т. д.