Почему нельзя сравнивать . (точка) как строковое значение внутри круглых скобок оператора if?

Ответ @Gilles поможет вам с синтаксисом в.zshrc

Чтобы узнать, какие коды использовать для каждой клавиши, есть полезный и полный список вhttp://zshwiki.org/home/zle/bindkeys. Для меня нажатие Ctrl + V , затем клавиша, код которой вы хотите узнать, работает лучше всего (где угодно, включая внутри nano или vim ).

    bindkey "^[[5~" history-search-backward
    bindkey "^[[6~" history-search-forward

3
22.12.2019, 06:44
2 ответа

Есть проблема с переводом языков.
В языке арифметических выражений точки не существует.

Вы используете язык, который не может работать внутри "$ ((… ))".

Внутри "$ ((… ))" (арифметическое выражение )могут быть только числа (обычно целые типа 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
5
27.01.2020, 21:12

Как вы подозреваете, ((== ))сравнивает два числовых значения. Но внутри этих(())для удобства вы также можете просто написать имена переменных --, вам не нужно говорить $VAR, просто VAR.

Также обратите внимание, что сообщение об ошибке не содержит кавычек. Я этому слегка удивлен. На самом деле, нет --анализатор проверяет его на наличие замен, а затем передает слово с удаленными кавычками.

Тем не менее, я полагаю, что синтаксический анализатор с радостью примет проблему1 в качестве имени переменной, пока не встретится с.; поэтому он сообщает текст, который не может понять, начиная с «.sh».

1
27.01.2020, 21:12

Теги

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