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

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

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

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

0
nl ja de
Я хотел бы упомянуть об этом вопросе. Я заявил в вопросе, что я
добавлено автор vfclists, источник
Я хочу прокомментировать отношение к голосованию и явное отношение «я тоже» к SO. Когда я опубликовал этот вопрос за короткое время, было около 4 комментариев (которые все исчезли сейчас), спрашивая меня, что я имел в виду под «переменной», когда я четко заявил, что не могу объяснить это правильно только, что переменные bash были разными. На этот комментарий есть два ответа, которые каким-то образом подходят к моему пониманию. Правильно ли, чтобы люди, которые не понимают предмет голосования, закрываются без объяснения причин или даже того, кто они? Я также думаю, что они действовали согласованно, чтобы собрать очки.
добавлено автор vfclists, источник
Я хочу прокомментировать отношение к голосованию и явное отношение «я тоже» к SO. Когда я опубликовал этот вопрос за короткое время, было около 4 комментариев (которые все исчезли сейчас), спрашивая меня, что я имел в виду под «переменной», когда я четко заявил, что не могу объяснить это правильно только, что переменные bash были разными. На этот комментарий есть два ответа, которые каким-то образом подходят к моему пониманию. Правильно ли, чтобы люди, которые не понимают предмет голосования, закрываются без объяснения причин или даже того, кто они? Я также думаю, что они действовали согласованно, чтобы собрать очки.
добавлено автор vfclists, источник

4 ответы

В большинстве языков переменные могут содержать разные значения. Например, в 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 , имя файла с меткой времени.

3
добавлено

В большинстве языков переменные могут содержать разные значения. Например, в 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 , имя файла с меткой времени.

3
добавлено

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

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

foo ()
{
  grep bar baz
}

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

quux=$?

Это просто сохранение статуса выхода, а не какого-либо значения. Контрастируйте это с помощью языка, такого как Javascript, функции могут фактически возвращать значения.

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

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

quux = foo();
1
добавлено

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

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

foo ()
{
  grep bar baz
}

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

quux=$?

Это просто сохранение статуса выхода, а не какого-либо значения. Контрастируйте это с помощью языка, такого как Javascript, функции могут фактически возвращать значения.

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

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

quux = foo();
1
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.