Описание тега standard-visitor-visas
В стандарте POSIX вводит слово расширение, чтобы быть сделано в следующем порядке (подчеркиваю-мое):
Тильда расширения (см. Тильды расширения), параметр расширения (см. параметр расширения), подстановка команд (см. подстановка команд), и расширение арифметики (см. расширение арифметики) должны быть выполняется от начала до конца. См. пункт 5 В признания знак.
Разделение поля (см. разделение поля) должны быть выполнены на части полей, генерируемых Шаг 1, Если IFS отсутствует.
Расширение пути (см. расширение пути) производится, если не установлено -F является в действительности.
Удаление цитату (см. Удаление цитату) всегда должна выполняться последней.
Единственный пункт, который нас здесь интересует-первый: как вы можете видеть Тильда расширение обрабатывается до разложения по параметру:
- Оболочка попытки Тильды экспансии на
Эхо $х
, нет Тильды, чтобы его нашли, поэтому он продолжается. - Оболочка попытки параметр расширения на
Эхо $х
,$х
нашел и расширил и командной строки становитсяЭхо ~/someDirectory
. - Обработка продолжается, Тильда расширение уже обработал
~
персонаж остается как есть.
С помощью кавычек, назначая $х
, вы были явно с просьбой не расширять Тильда и рассматривать его как обычный символ. Дело зачастую не в том, что в команды оболочки вам не придется цитировать всю строку, так что вы можете сделать расширение произошло прямо во время присвоения значений переменным:
пользователь@хост:~$ взаимозачета содержит
пользователь@хост:~$ х=~/'someDirectory'
+ х=в/Home/пользователь/someDirectory
пользователь@хост:~$ Эхо $х
+ Эхо /главная/пользователя/someDirectory
/пользователя//someDirectory
пользователь@хост:~$
И вы можете также сделать расширение происходит на Эхо
командной строки так долго, как это может произойти перед параметра расширения:
пользователь@хост:~$ х='someDirectory'
+ х=someDirectory
пользователь@хост:~$ Эхо ~/$х
+ Эхо /главная/пользователя/someDirectory
/пользователя//someDirectory
пользователь@хост:~$
Если по какой-то причине вам действительно нужно, чтобы повлиять на Тильда к $Х
переменных без расширения, и быть в состоянии расширить его за эхо
команду, вы должны проходить в два раза в силу двух экспансий $х
переменных происходит:
пользователь@хост:~$ х='~/someDirectory'
+ х='~/someDirectory'
пользователь@хост:~$ Эхо "$( эвал Эхо $х )"
++ ивала Эхо '~/someDirectory'
+++ Эхо /главная/пользователя/someDirectory
+ Эхо /главная/пользователя/someDirectory
/пользователя//someDirectory
пользователь@хост:~$
Однако следует помнить, что в зависимости от контекста, где используется такая структура может иметь нежелательный побочный эффект. Как правило, предпочитают избегать всего, что требует ивала
, когда у вас есть другой способ.
Если вы хотите конкретно Тильда проблем, в отличие от любого другого вида расширения, то такая структура будет более безопасным и портативный:
пользователь@хост:~$ х='~/someDirectory'
+ х='~/someDirectory'
пользователь@хост:~$ случае "$X" в "~/"*)
> х="${домой}/${х#"~/"}"
> эсок
+ чехол "$X" в
+ х=в/Home/пользователь/someDirectory
пользователь@хост:~$ Эхо $х
+ Эхо /главная/пользователя/someDirectory
/пользователя//someDirectory
пользователь@хост:~$
Эта структура явно проверить наличие лидирующей ~
и заменяет его домашний каталог пользователя, если он найден.
После вашего комментария, х="${домой}/${х#"~/"}"
действительно может быть удивительно для кого-то не используется в Shell-программировании, но на самом деле, привязанные к тому же в POSIX правила я приводил выше.
Как введенных стандартом POSIX, удаление цитирую происходит в прошлом и параметр расширения происходит очень рано. Таким образом, ${#"~"}
вычисляется, и расширилась далеко до оценки внешних кавычек. В поворотах, как определено в параметре расширения правил:
В каждом случае, что значение слова необходимы (в зависимости от состояния параметр, как описано ниже), слово может быть подвергнут Тильда расширение, расширение параметров, подстановка команд и арифметических расширение.
Таким образом, правая сторона #
оператор должен быть правильно процитировал или бежал, чтобы избежать Тильда экспансии.
Так, чтобы состояние его по-разному, когда оболочка переводчик смотрит на х="${домой}/${х#"~/"}"
, он видит:
${Дома}
и${Х#"~/"}
должны быть расширены.${Дома}
расширено содержаниедомашнего
переменной.${х#"~/"}
триггеров, вложенных расширения:"~/"
анализируется, но, цитируется, рассматривается как литерал1. Вы могли бы использовать здесь одинарные кавычки с тем же результатом.${х#"~/"}
выражение себя сейчас расширяться, в результате чего префикс~/
быть удалены от значенияпеременной$x
.- В результате сейчас объединяются: Расширение
${дома}
, буквальный/
расширение${х#"~/"}
. - Конечный результат будет заключаться в двойные кавычки, функционально предотвратить разбиение на слова. Я говорю, что функционально здесь, потому что эти двойные кавычки технически не требуется (см. тут и тут например), а как личный стиль, как только задания получает ничего, кроме
А=$Б
обычно я нахожу его более четким добавить двойные кавычки.
Кстати, если присмотреться более внимательно к делу
синтаксис, вы увидите "~/"*
конструкции, которая опирается на той же концепции, х=~/'someDirectory'
я объяснил выше (здесь опять двойные и простые кавычки могут быть использованы как синонимы).
Не волнуйтесь, если эти вещи могут показаться непонятными на первый взгляд (может быть, даже на втором или поздно так!). На мой взгляд, расширение параметров, с подоболочек, один из самых сложных концепция при программировании на языке оболочки.
Я знаю, что некоторые люди могут бурно не соглашаться, но если вы хотели-бы освоить Shell-программировании более подробно я призываю вас, чтобы прочитать расширенный написании сценариев для интерпретатора bash руководство: оно учит Баш-скрипты, поэтому с большим количеством расширений и колокола-и-свистки по сравнению с POSIX Shell-скриптинг, но я думаю, это написано с массой практических примеров. Как только вам удастся это, нетрудно ограничить себя в POSIX, в особенности, когда вам нужно, лично я считаю, что ввод непосредственно в POSIX области-это лишние крутой кривой обучения для начинающих (сравните мой с POSIX Тильда замена с @m0dular регулярных выражений-как Баш эквивалент, чтобы понять, о чем я ;) !).
1: что наводит меня на поиски ошибок в тире, которые не реализовать Тильда расширение здесь правильно (проверяемые с помощью х='~/фу'; Эхо "${х#~/}"
). Расширение параметр представляет собой комплексное мероприятие, как для пользователя, так и сами разработчики оболочки!