Bash :Арифметическое расширение, расширение параметров и оператор запятой

Запустите эту команду:

$ tput rmcup

Вероятнее всего, вы локально или удаленно запускали команду (, например vimили top, или многие программы, использующие библиотеки, подобные ncurses), использующие «альтернативную команду» терминала. Режим экрана. Когда это активно, многие терминальные программы переназначают действие прокрутки мыши на клавиши со стрелками,потому что обычно прокрутка локального дисплея менее чем полезна. Если это приложение завершилось некорректно, ваш терминал все еще может считать, что он находится в этом режиме.

Эта команда сбрасывает это и должна снова -разрешить вам возможность прокрутки.

Я предполагаю, что вы используете iTerm?

1
14.03.2020, 07:09
2 ответа

Расширение параметра оболочки происходит перед вычислением выражения, включая обработку запятых:

The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially. All tokens in the expression undergo parameter and variable expansion, command substitution, and quote removal. The result is treated as the arithmetic expression to be evaluated.

Вы можете увидеть это с помощью

unset n
echo $((n++,k=$n))

Сообщение об ошибке,

bash: n++,k=: syntax error: operand expected (error token is "=")

показывает, что $nзаменяется до обработки всего арифметического выражения.

В вашем случае оценивается выражение

n++,k=3
3
28.04.2021, 23:21

Внутри $((...))сначала выполняется раскрытие¹ как бы в двойных кавычках, а затем оценивается результат.

Таким образом, вn=3; k=10; echo $((n++,k=$n))(или n=1; echo "$((++n + $n))", которые не ограничиваются ,), вычисляется арифметическое выражение n++, k=3.

Здесь вам нужно:

n=3; k=10; echo "$((n++,k=n))"

(также обратите внимание на кавычки, так как арифметическое расширение зависит от split+glob, как и другие формы расширения слов в оболочках POSIX ).


¹, вы найдете некоторые варианты, когда массивы и ассоциативные массивы вызываются, поскольку некоторые оболочки будут пытаться правильно обрабатывать $((hash[$key]++)), когда $keyсодержит ], например

3
28.04.2021, 23:21

Теги

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