Поведение мёртвых клавиш в стиле OS X в Linux

Можно сделать что-то похожее на то, что вы показали, используя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

4
21.01.2014, 00:44
1 ответ

Я просто хотел бы сказать, что комментарий от 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.

0
23.03.2020, 06:35

Теги

Похожие вопросы