Неинтерпретируемые аргументы оболочки $1
, $2
, и т.д. Необходимо поместить их расширение в двойные кавычки в большинстве контекстов, для предотвращения значения параметра, расширяемого далее. "$@"
дает Вам список всех параметров.
Например, если Вы хотите передать аргумент сценария оболочки к Вашей функции, назовите его как это:
first_argument_as_filename_in_unix_syntax=$(posix "$1")
Двойные кавычки необходимы. Если Вы пишете posix $1
, затем то, что Вы являетесь передающими, не является значением первого параметра, но результатом работающего разделения слова и globbing на значении первого параметра. Необходимо будет использовать надлежащее заключение в кавычки при вызове сценария, также. Например, если Вы пишете это в ударе:
myscript c:\path with spaces\somefile
затем фактические, неинтерпретируемые аргументы myscript
будет c:path
, with
и spacessomefile
. Не делайте этого.
Ваш posix
функция является неправильной, снова потому что она испытывает недостаток в двойных кавычках вокруг $1
. Всегда помещайте двойные кавычки вокруг переменной и управляйте заменами: "$foo"
, "$(foo)"
. Легче помнить это правило, чем исключения, где Вам на самом деле не нужны кавычки.
echo
делает его собственную обработку в некоторых случаях, и вызов внешних процессов является медленным (особенно в Windows). Можно сделать целую обработку в ударе.
posix () {
path="${1//\\//}"
case "$path" in
?:*) drive="${p:0:1}"; drive="${drive,}"; p="/$drive/${p:2}";;
esac
printf %s "$p"
}
zsh функция, на которую сослался jw013, не делает то, что Вы, кажется, думаете, что это делает. Можно поместить noglob
перед командой и zsh не выполняет globbing (т.е. поколение имени файла, т.е. расширение подстановочных знаков) на аргументах. Например, в zsh, если Вы пишете noglob locate *foo*bar*
, затем locate
назван с аргументом *foo*bar*
. Вы обычно скрывались бы noglob
встроенный позади псевдонима. Эта функция не важна, для какого Вы пытаетесь сделать.
Заключение в кавычки от этой статьи Wiki:
Интернет-стандарты (Запрос на Комментарии) для мандата протоколов, что маркировки имени хоста компонента могут содержать только буквы ASCII через 'z' (нечувствительным к регистру способом), цифры '0' до '9', и дефис ('-'). Исходная спецификация имен хостов в RFC 952, переданном под мандат, который маркировки не могли запустить с цифры или с дефиса и не должны заканчивать дефисом. Однако последующая спецификация (RFC 1123) разрешила маркировкам имени хоста запускаться с цифр. Никакие другие символы, знаки пунктуации или пробел не разрешены.
Подчеркивание _
не допустимый символ в имени хоста.
-
вместо этого? – casey 14.01.2014, 04:53