Рейтинг:0

В чем разница между этими двумя выражениями [Shell Script]

флаг gd

Новичок здесь. Ну, у меня возникли проблемы с пониманием разницы между:

пусть a=$a+$b
пусть я=$я+1 

и:

а+=$б
я = $ (( $ я + 1))

Определенно есть разница, потому что второе выражение испортило мой сценарий, дав значение мусора.

Вот мой сценарий:

вопрос в том [сценарий должен дать пользователю возможность ставить некоторые отметки в качестве входных данных, пока пользователь не даст q (в качестве выхода) или отрицательное значение, в конце концов, нам нужно вычислить среднее значение заданных оценок]

этот скрипт работает, но если вы измените пусть Мойенн=$Мойенн+$нота и пусть я=$я+1 с мойенн+=$примечание и я = $ (( $ я + 1)) это даст мусорное значение для Мойенн (среднее значение).

#!/бин/баш

примечание=0
Мейенн=0
я=0

до [ "$ note" -lt 0 ]; делать
  read -p "Entrer la note (appuyez sur q pour quitter):" примечание
  если [ "$ note" = "q" ]; тогда
    примечание=-4
    эхо "Выход"
  Элиф [ "$ note" -ge 16 ]; тогда
    эхо "Tres Bien"
  элиф [ "$ note" -ge 14 ]; тогда
    эхо "Бьен"
  Элиф [ "$ note" -ge 12 ]; тогда
    эхо "Assez bien"
  Элиф [ "$ note" -ge 10 ]; тогда
    эхо "Мойен"
  Элиф [ "$ note" -ge 0 ]; тогда
    эхо "Инсуффи"
  еще
    эхо "Выход"
  фи
  если [ "$ note" -ge 0 ]; тогда
    пусть Мойенн=$Мойенн+$нота
    пусть я=$я+1
  фи
сделано
Мойенн=$(($Мойенн / $i))
echo "la moyenne est $moyenne de $i notes"

waltinator avatar
флаг it
Всегда вставляйте свой скрипт в `https://shellcheck.net`, средство проверки синтаксиса или устанавливайте `shellcheck` локально. Сделайте использование `shellcheck` частью вашего процесса разработки.
OUSSAMA ABBOU avatar
флаг gd
@waltinator спасибо
Рейтинг:3
флаг hr

Соответствующий раздел человек:

   В контексте, где оператор присваивания присваивает значение
   переменная оболочки или индекс массива, оператор += может использоваться для добавления к
   или добавить к предыдущему значению переменной. Сюда входят аргументы
   встроенные команды, такие как declare, которые принимают операторы присваивания
   (команды объявления). Когда += применяется к переменной, для которой
   задан целочисленный атрибут, значение оценивается как арифметическое exâ
   нажатием и добавляется к текущему значению переменной, которое также является eval.
   уед. Когда += применяется к переменной массива с помощью составного присваивания.
   (см. Массивы ниже), значение переменной не сбрасывается (как это
   при использовании =), и новые значения добавляются к массиву, начиная с
   на единицу больше максимального индекса массива (для индексированных массивов) или
   добавляются как дополнительные пары ключ-значение в ассоциативный массив. Когда ап
   сопоставляется со строковой переменной, значение расширяется и добавляется к
   значение переменной.

Поскольку вы не установили целочисленный атрибут для а, а+=$б будет выполнять конкатенация строк вместо арифметического сложения:

$а=1; б=2; а+=$б; эхо "$а"
12

тогда как

$ сбросить а б
$ объявить -я=1; б=2; а+=$б; эхо "$а"
3

Кроме того, вы можете принудительно выполнить арифметическую оценку, используя (( ... ))

$ сбросить а б
$а=1; б=2; ((а+=$b)); эхо "$а"
3

(Обратите внимание, что ((а+=б)) также работает; в $ нет необходимости разыменовывать переменные в арифметическом контексте).

OUSSAMA ABBOU avatar
флаг gd
спасибо, теперь понял.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.