Почему переменные bash «разные»?

Есть ли какая-то причина, по которой переменные bash отличаются от переменных на других «нормальных» языках программирования?

Это связано с тем, что они устанавливаются выходом предыдущих программ или должны быть заданы каким-то литералом, то есть они должны быть установлены выходом какой-либо программы или что-то, что выводит текст через стандартный ввод/вывод или консоль или подобное?

Я затрудняюсь использовать правильный словарный запас, но может любой, кто может понять, что я пытаюсь сказать, и, возможно, использовать правильные слова или указать мне некоторые документы, где я лучше понимаю понятия переменной bash.

В большинстве языков переменные могут содержать разные значения. Например, в Python переменная может быть числом, которое вы можете сделать арифметикой ( `a-1` ), массивом или строкой, которую вы можете разделить ( `a [3:]`  ) или пользовательский вложенный объект ( `person.name.first_name` ).

В bash вы не можете делать это прямо. Если бы я понял вас правильно, вы спросили, почему это так.

Есть две причины, по которым вы не можете сделать то же самое в bash.

Один: переменные среды - это (условно) простые строки key = value, а оригинальная sh - довольно тонкая оболочка поверх модели процесса Unix. Баш работает одинаково, по техническим причинам и соображениям совместимости. Поскольку все переменные (на основе) строк, вы не можете иметь богатые, вложенные типы.

Это также означает, что вы не можете установить переменную в подселле/индексе, который вы вызываете. Переменная не будет установлена в родительском скрипте, потому что это не так, как работают переменные среды.

Два: оригинал sh не разделяет код и данные, так как это облегчает работу с интерактивным способом. Sh обрабатывал все неспециальные символы как литералы. То есть  `find/-name foo`  считался четырьмя буквальными строками: командой и тремя аргументами.

Bash не может просто решить, что  `find/-name`  теперь означает «значение переменной find, деленное на отрицательное значение имени переменной», поскольку это означало бы, что команды поиска каждого пользователя начнут ломаться. Вот почему вы не можете иметь простой синтаксис разыменования других языков.

Даже  `$ name-1  не может использоваться для выражения, потому что его можно так же легко использовать как часть  $ name-1-12-2012.tar.gz`  , имя файла с меткой времени.



В большинстве языков переменные могут содержать разные значения. Например, в Python переменная может быть числом, которое вы можете сделать арифметикой ( `a-1` ), массивом или строкой, которую вы можете разделить ( `a [3:]`  ) или пользовательский вложенный объект ( `person.name.first_name` ).

В bash вы не можете делать это прямо. Если бы я понял вас правильно, вы спросили, почему это так.

Есть две причины, по которым вы не можете сделать то же самое в bash.

Один: переменные среды - это (условно) простые строки key = value, а оригинальная sh - довольно тонкая оболочка поверх модели процесса Unix. Баш работает одинаково, по техническим причинам и соображениям совместимости. Поскольку все переменные (на основе) строк, вы не можете иметь богатые, вложенные типы.

Это также означает, что вы не можете установить переменную в подселле/индексе, который вы вызываете. Переменная не будет установлена в родительском скрипте, потому что это не так, как работают переменные среды.

Два: оригинал sh не разделяет код и данные, так как это облегчает работу с интерактивным способом. Sh обрабатывал все неспециальные символы как литералы. То есть  `find/-name foo`  считался четырьмя буквальными строками: командой и тремя аргументами.

Bash не может просто решить, что  `find/-name`  теперь означает «значение переменной find, деленное на отрицательное значение имени переменной», поскольку это означало бы, что команды поиска каждого пользователя начнут ломаться. Вот почему вы не можете иметь простой синтаксис разыменования других языков.

Даже  `$ name-1  не может использоваться для выражения, потому что его можно так же легко использовать как часть  $ name-1-12-2012.tar.gz`  , имя файла с меткой времени.



Я бы сказал, что это связано с функциями Bash. Функции Bash не могут вернуть значение, а только код состояния.

Итак, с Bash вы можете иметь функцию

```
foo ()
{
  grep bar baz
}

```

Но если вы попытаетесь «сохранить» возвращаемое значение функции

```
quux=$?

foo ()
{
  return document.getElementById("dog").getAttribute("cat");
}

и сохранить как это

quux = foo();



Я бы сказал, что это связано с функциями Bash. Функции Bash не могут вернуть значение, а только код состояния.

Итак, с Bash вы можете иметь функцию

foo ()
{
  grep bar baz
}

Но если вы попытаетесь «сохранить» возвращаемое значение функции

quux=$?

```

```
foo ()
{
  return document.getElementById("dog").getAttribute("cat");
}

```

и сохранить как это

```
quux = foo();

```