Ожидаемое целочисленное выражение, сценарий BASH, оператор IF

#bash #shell #if-statement

#bash #оболочка #if-statement

Вопрос:

Я пытаюсь вставить имена и числа в текстовый файл. Я написал короткий сценарий для целей обучения.

 v= expr $# % 2
echo $v
if [ "$v" -eq 0 ]; then
    i=1
    while [ "$i" -lt $# ]
    do
        echo "$i    $i 1" >> database
        i=$((i 1))
    done
echo "User(s) successfully added nv"
else
    echo "Arguments are not complete";
fi
 

Когда я ввожу два аргумента, вывод оболочки выглядит следующим образом

 0                     # (The value of variable v)
./myscript: line 3: [: : integer expression expected
Arguments are not complete  # (else statement is executed)
 

Когда я заменяю -eq на == в строке 3 (оператор if), сообщение об ошибке исчезло, но все равно оператор IF выполняется не так, как я ожидаю.

 0              # (output of variable v)
Arguments are not complete # (else statement is executed)
 

Ответ №1:

Вам нужно заключить присвоение переменной в $(...) («подстановка команды»):

 v=$(expr $# % 2)
 

В if инструкции -eq должно быть правильным. Кроме того, чтобы убедиться, что это работает, я бы использовал двойные квадратные скобки (это может зависеть от используемой вами оболочки):

if [[ ${v} -eq 0 ]]; then

Комментарии:

1. Спасибо, я добавил двойные скобки в оператор IF, и это сработало. Пожалуйста, объясните, в чем разница в одинарных и двойных скобках в операторе if. Я также хочу прочитать аргументы, переданные сценарию. Я хочу прочитать его таким образом, например, для i = 1, $ ($ i) должен прочитать $ 1 (сначала аргумент).

2. Разница между одинарными и двойными скобками хорошо объяснена здесь: ( serverfault.com/questions/52034 /… ) Ваша идея для for цикла почти завершена, вам просто нужна последовательность для повторения, вы также можете сделать это с помощью подстановки команд: for i in $(seq 1 $#); do <code> ; done

Ответ №2:

Непосредственной проблемой является неспособность использовать подстановку команд для захвата результата expr команды : v=$( expr $# % 2 ) . Однако expr для арифметики больше не требуется; используйте арифметическое выражение так же, как вы делали для увеличения i .

 v=$(( $# % 2 ))