#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 ))