В чем проблема со следующим сценарием оболочки? я собираюсь
[: too many arguments
ошибка
#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
#something
fi
Во-первых, команда [
только делает сравнения. Вы должны выполнять расчеты отдельно. Например:
var1mod=$((var1 % 2))
if [ $var1mod -eq 0 ]; then
Однако, поскольку вы, кажется, пишете свой сценарий для bash, вы можете использовать другую команду и избежать дополнительного шага:
if (( var1 % 2 == 0 )); then
И, во-вторых, вы не можете связывать команды с -a
. Это работает только как аргумент для [
. Но вне этого вы должны использовать &&
.
Три разных варианта:
if [ $var1mod -eq 0 -a $var2mod -eq 0 ]; then
if [ $var1mod -eq 0 ] && [ $var2mod -eq 0 ]; then
if (( var1 % 2 == 0 )) && (( var2 % 2 == 0 )); then
if (( var1 % 2 == 0 && var2 % 2 == 0 )); then
Всегда помните, что синтаксис if
является простой if command; then command; fi
. Это означает, что [
in if [
- это просто имя команды, такой как ls
или echo
.
Вы, кажется, путаете условную оценку с арифметической оценкой. %
является оператором арифметической оценки, а не условной оценки. См. Разделы справочной страницы bash(1)
для этих тем. [...]
для условной оценки, тогда как ((...))
для арифметической оценки.
Не говоря уже о том, что ваша строка shebang неверна, если только по какой-то причине вы не установили копию bash на корневом уровне вашего загрузочного диска.
И последнее, но не менее важное: новая строка такая же, как точка с запятой. Вам не нужно заканчивать строку точкой с запятой в сценариях оболочки. Точка с запятой просто существует, чтобы вы могли поместить два оператора в одну строку.
Вот очищенная версия вашего скрипта:
#!/bin/bash VAR1=10 VAR2=20 if (( (VAR1 % 2 == 0) && (VAR2 % 5 == 0) )); then : #something (colon is a no-op) fi