Ответ @Gilles поможет вам с синтаксисом в.zshrc
Чтобы узнать, какие коды использовать для каждой клавиши, есть полезный и полный список вhttp://zshwiki.org/home/zle/bindkeys. Для меня нажатие Ctrl + V , затем клавиша, код которой вы хотите узнать, работает лучше всего (где угодно, включая внутри nano или vim ).
bindkey "^[[5~" history-search-backward
bindkey "^[[6~" history-search-forward
Есть проблема с переводом языков.
В языке арифметических выражений точки не существует.
Вы используете язык, который не может работать внутри "$ ((… ))".
Внутри "$ ((… ))" (арифметическое выражение )могут быть только числа (обычно целые типа 1234
), операторы (+
, -
, *
, <<
и да ==
как оператор равенства, среди прочих ), и переменные (одна или несколько букв, цифр (не первый символ )и знаки подчеркивания ). Это все. Не существует концепции строки .
Когда вы пишете problem1
внутри арифметического выражения, оно понимается на этом языке как имя переменной (со значением 0, если оно не было определено ранее):
$ echo "==$((problem1))=="
==0==
$ problem1=34
$ echo "==$((problem1))=="
==34==
Не имеет значения, заключен ли текст в кавычки:
$ echo "==$(("problem1"))=="
==34==
То, что вы используете, ((…))
также является арифметическим выражением, которое просто не имеет вывода. Он просто устанавливает статус выхода(и, как и в C, истинно, если результатом выражения является не 0).
$ (( 1 + 1 )) ; echo "$?"
0
$ (( 0 )) ; echo "$?"
1
$ (( 1 - 10 )) ; echo "$?"
0
Но арифметическое выражение не понимает, что такое точка, ни как оператор, ни как имя переменной, поэтому генерирует синтаксическую ошибку:
$ echo "$(( 1.3 ))"
bash: 1.3 : syntax error: invalid arithmetic operator (error token is ".3 ")
То же самое относится и к имени переменной (problem1
), за которым следует точка, а затем другое имя переменной(sh
).
$ echo "$((problem1.sh))"
bash: problem1.sh: syntax error: invalid arithmetic operator (error token is ".sh")
Если бы оператор был +
вместо точки, выражение работало бы:
$ echo "$((problem1+sh))"
34
Если problem1
установлено на 34 (, как указано выше ).
Итак,единственный способ сравнить строки — использовать[[…]]
:
$ [[ problem1.sh == problem1.sh ]] && echo YES
YES
(не заключает в кавычки правую часть ==
в данном конкретном случае, так как нет раскрытия переменных и в строке нет подстановочных символов, но в общем случае следует заключать в кавычки строку справа от==
).
Или, аналогично тому, что вы написали:
if [[ "problem1.sh" == "problem1.sh" ]]
then printf "Okay"
fi
Как вы подозреваете, ((== ))сравнивает два числовых значения. Но внутри этих(())для удобства вы также можете просто написать имена переменных --, вам не нужно говорить $VAR, просто VAR.
Также обратите внимание, что сообщение об ошибке не содержит кавычек. Я этому слегка удивлен. На самом деле, нет --анализатор проверяет его на наличие замен, а затем передает слово с удаленными кавычками.
Тем не менее, я полагаю, что синтаксический анализатор с радостью примет проблему1 в качестве имени переменной, пока не встретится с.; поэтому он сообщает текст, который не может понять, начиная с «.sh».