Я знаю, что существует что-то другое о среде Терминальной командной строки и среде в сценарии удара, но я не знаю, каково то различие...
Вот пример, который наконец привел меня спрашивать этот quesiton; это может спугнуть некоторые различия.
Я пытаюсь разделить ведущий '0 от числа с этой командой.
var="000123"; var="${var##+(0)}" ; echo $var
Когда я выполняю эту команду от командной строки Терминала, я добираюсь: 123
Однако, когда я выполняю его из сценария, это не работает; я добираюсь: 000123
Я использую Ubuntu 10.04 и попробовал все следующее результатами sam:
Мой выпуск i486-pc-linux-gnu версии 4 1 5 1 удара (в терминалах и сценариях)
различия 'в shopt' между CLI и Сценарием:
CLI Script
on off checkwinsize
on off expand_aliases
on off extglob
on off histappend
off on hostcomplete
Что вызывает это различие?
Даже если некоторое обновление заставит его работать в сценариях...
Я пытаюсь узнать, какой и почему, таким образом, в будущем, я буду знать, что высматривать.
Вот является 3 удара способами разделить ведущий '0. (Я знал только один, когда я сначала задал этот вопрос),
var=0001230; var="$[10#$var]"; echo $var # fastest= 1.00 integers only
var=0001230; var="${var##+(0)}"; echo $var # slower x 1.25 works with strings, but requires shopt -s extglob
var=0001230; var="${var#${var%%[!0]*}}"; echo $var # slower x 1.61 works with strings
На ваш вопрос нельзя ответить достаточно широко. Некоторые комментарии, хотя. В моей версии bash (3.1.17 (1) -релиз) ваша команда не выдает желаемого результата даже при запуске из командной строки; то же самое с зш. По-видимому, что-то не так в вашей команде. Я не знаю, что "## + (0)" предполагается выполнить, но "# 0" удаляет один ведущий ноль. В этом показан способ удаления произвольных чисел из нулей.
Если действительно есть разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (другую версию bash, bash вместо zsh) или другие параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc
и $HOME/.profile
, тогда как сценарии обычно этого не делают. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые должны быть установлены в каждой оболочке.
Предполагая, что вы используете одну и ту же оболочку в своем скрипте и в своем терминале, основное отличие состоит в том, что ~/.bashrc
читается интерактивными оболочками, а не интерпретирующими скрипты оболочками. Причина в том, что скрипты обычно должны быть несколько переносимыми, и поэтому вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
в любом случае применимы только к командной строке (настройки подсказок, привязки клавиш). Некоторые, такие как определения функций, имеют смысл и в скриптах; как правило, вы помещаете их в отдельный файл и получаете его как из ~/.bashrc
, так и из сценариев. Иногда вам нужны некоторые параметры оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошо в командной строке), но более загадочному или менее переносимому (плохо в сценариях) коду. Есть несколько вещей, которые bash делает по-другому, например, расширение истории (!!
и т. д.) по умолчанию включено только в интерактивных оболочках.
Здесь вы используете конструкцию +(…)
, которая представляет собой расширенный шаблон глобализации ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, у вас есть это в вашем ~/.bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения ведущих 0
из переменной, такой как
var=${var#${var%%[!0]*}}