В чем проблема со следующим сценарием оболочки? я собираюсь

[: too many arguments

ошибка

#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
    #something
fi

2 ответа2

5

Во-первых, команда [ только делает сравнения. Вы должны выполнять расчеты отдельно. Например:

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 .

2

Вы, кажется, путаете условную оценку с арифметической оценкой. % является оператором арифметической оценки, а не условной оценки. См. Разделы справочной страницы 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

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