Bash присваивание с «let» не выполняется с «/» - PullRequest
1 голос
/ 05 мая 2020

Я использую GNU bash, версию 5.0.3 (1) -release (x86_64-p c - linux -gnu), и мне интересно, почему простой оператор присваивания дает синтаксическую ошибку:

#/bin/bash

var1=/tmp       # This works
let var2=/tmp   # This fails with syntax error: Operand expected (error is "/tmp")

Кто-нибудь знает почему? Спасибо

Ответы [ 2 ]

1 голос
/ 05 мая 2020

let - это встроенная оболочка, которая является еще одним способом использования $((..)) Arithmeti c Expansion в bash. Присваивание

let var2=/tmp 

обрабатывается оболочкой как арифметическая операция c «деление» с неверным значением частного. Это эквивалентно действию.

var=$((/tmp))

Поскольку имеется неправильное количество операндов, синтаксический анализатор выдал ошибку, которую вы видите. Обратите внимание, что tmp по-прежнему обрабатывается оболочкой в ​​контексте переменной. Если бы синтаксический анализатор идентифицировал выражение как действительное, тогда tmp подверглось бы расширению переменной. Поскольку он не был установлен ранее, это, вероятно, привело бы к ошибке «деления на ноль».

Для простого назначения переменных просто отбросьте ключевое слово let и заключите поле значения в «кавычки»

var2="/tmp"
1 голос
/ 05 мая 2020

let используется только для арифметических операций c, так же, как (( )).

Следовательно, следующие строки такие же

a=$((60 * 60))
let a=(60*60)
((a = 60 * 60))

См. страница руководства .

...