Можно сделать что-то похожее на то, что вы показали, используяdeclare -i
:
declare -i nextcount
nextcount=$count+1
Это объявляет переменную nextcount
с целочисленным атрибутом, что приводит к автоматическому арифметическому вычислению при каждом назначении. (Запустите help declare
в bash или посмотрите здесь для получения подробной информации. )Это не стандартная функция оболочки POSIX, но bash ее поддерживает.
Назначение не обязательно должно следовать непосредственно за командой declare
. Если это так, вы можете сделать это с помощью команды declare
,вот так:
declare -i nextcount=$count+1
Поддерживаются любые арифметические выражения с целыми числами и арифметическими операторами . Если операторы рискуют быть специально интерпретированы оболочкой по-другому, вы можете заключить выражение в кавычки, чтобы предотвратить это. Помните, что вы присваиваете текст переменной; над этим текстом выполняется арифметическая оценка. Для другого примера, после этой команды $x
расширится до13
:
declare -i x='2 * 7 - 1'
Даже если вы удалили пробелы, вы бы хотели, чтобы это было заключено в кавычки, потому что *
иначе интерпретировало бы его как glob , запуская расширение имени файла . Обратите внимание, что вокруг =
не должно быть пробелов.
Хотя обычно вы так не поступаете. Часто проще, элегантнее и читабельнее использовать арифметическое расширение(с$
)или арифметическую оценку(без $
), как предполагают другие ответы. Я представляю метод, показанный здесь, не для того, чтобы побудить вас предпочесть его, а главным образом потому, что он наиболее близок к тому, что показано в вашей книге, и фактически выполняет арифметику оболочки.
Арифметические выражения --, под которыми я подразумеваю выражения, которые оцениваются с использованием арифметики оболочки, поскольку они находятся внутри$((
))
или ((
))
--, позволяют использовать =
с пробелами вокруг него. =
в команде ((count = 10))
синтаксически не работает так же, как =
в команде count=10
.
Если x
имеет целочисленный атрибут (declare -i x
), вы даже можете написать что-то подобное, чтобы присвоить значение нескольким переменным, хотя я бы не советовал этого делать на том основании, что это сбивает с толку:
x=y=z=10
Если вам интересно, что это делает, вот подсказка --это делает то же самое:
x='y = z = 10'
Это присваивает строкеy = z = 10
(или, в первом примере,y=z=10
)значение x
. Важно, чтобы как минимум x
имел целочисленный атрибут. Предполагая, что это так,этот текст оценивается как арифметическое выражение. Подвыражение z = 10
присваивает 10
значение z
, но это подвыражение также имеет значение 10
, которое присваивается y
. Это полное выражение, которое является присваиванием y
, также имеет значение, по-прежнему 10
.
Обратите внимание, что первый =
выполняет обычное присваивание переменной оболочки, а остальные являются арифметическим оператором присваивания. Это не специально для второй формы (той, которая, находясь в кавычках, может содержать пробелы ). В x=y=z=10
первое =
также означает нечто отличное от двух других =
, хотя вы используете их для достижения той же цели. Это потенциально сбивает с толку. Я рекомендую не писать подобные вещи, за исключением, возможно, интерактивных целей для экспериментов. Вместо этого вы можете написать эту команду:
((x = y = z = 10))
Это простая арифметическая оценка. Все три знака =
являются арифметическим оператором присваивания. Все еще хорошо, если вы объявили некоторые или все переменные с целочисленным атрибутом --, за который я часто выступаю --, но вам не нужно этого делать.
Аналогичным образом в bash есть оператор +=
, который обычно добавляет текст:
$ x=foo
$ x+=bar
$ echo "$x"
foobar
(Начальные $
символы в некоторых строках — это моя подсказка. Я включаю их сюда, чтобы отличать входные данные, которые я даю bash, от выходных данных, которые он производит.)
Но атрибуты назначенной -переменной влияют на то, какую операцию +=
выполняет. +=
обычно используется для расширения индексированных массивов:
$ a=(foo bar baz)
$ a+=(quux)
$ echo "${a[@]}"
foo bar baz quux
Когда переменной с целочисленным атрибутом присваивается значение +=
, в -выполняется добавление места:
$ declare -i y=7
$ y+=2
$ echo "$y"
9
Но bash также имеет +=
в качестве арифметического оператора, который я предлагаю использовать вместо него в большинстве случаев. То есть, если y
содержит значение 2
,вместо этого вы можете написать это, чтобы увеличить значение y
на 2:
((y += 2))
Он также имеет другие традиционные составные операторы присваивания (, которые присутствуют в языке C ). Например, предположим, что я хочу уменьшить значение y
на 3. Это не работает:
$ y-=3
y-=3: command not found
Но это работает:
$ ((y -= 3))
$ echo "$y"
6
Или я мог бы просто сделать это, что одновременно изменяет y
и печатает новое значение:
$ echo "$((y -= 3))"
6
Я просто хотел бы сказать, что комментарий от quixotic отлично работает на Gnome3, а именно:
you might try the altgr-intl variant of the US layout. It moves the deadkeys to level3, so pressing ~ prints ~, and AltGr+~ gets the deadkey. Not quite the behavior asked for, but may be good enough.