Это работает, или кто-то может "взломать" / "сломать" мой скрипт, поместив куда-нибудь файл с именем '-n'?
В этом нет ничего плохого:
target="$(echo "$source"|sed 's#[^a-z0-9]\+#.#')"
Что происходит:
"$(...)"
- это подстановка команды , которая подставит результаты команды в качестве значения - в этом случаерезультат присваивается target
. echo "$source"|sed 's#[^a-z0-9]\+#.#'
просто передает результат вывода echo
(например, то, что в source
) в sed
для простой замены каждый символ нестрочная буква или цифра, за которой следует + с периодом 1 .Примечание: кавычки ".."
вокруг $source
являются правильными в подстановке команд. - Не существует внутренней причины, по которой присвоение
-n
переменной приведет к любым неприятностям.То, что вы делаете с переменной, это другой вопрос, но достаточно сказать, что трудно увидеть какие-либо проблемы. - "POSIX-оболочка там не реализует
printf
" - А?Любая оболочка, не реализующая printf
, будет скорее исключением, чем правилом.См. printf - Открытая библиотека групп , которая является POSIX.
Если вы пытаетесь printf
вывод, который начинается с '-'
, просто предшествуйте выводу с "--"
дляукажите End-of-Options перед строкой, которую вы хотите напечатать, и все будет хорошо.В вашем примере "-n"
, printf
- это единственный способ, которым вы будете выводить переменную, начинающуюся с одиночного '-'
, например:
$ t="-n"
$ printf -- "%s\n" "$t"
-n
( note: вам не нужно включать "--"
в printf "%s\n" "$var"
, единственное время, когда вы должны включить его, - printf -- "-foo\n"
, иначе вы получите "invalid option error"
.
For echo
Вы можете включить интерпретацию обратной косой черты с помощью -e
и включить backspace , например,
$ echo -e " \b$t"
-n
Я думаю, что это охватило все проблемы. Если нет, дайте мне знать., если у вас есть какие-либо дополнительные вопросы, оставьте комментарий ниже или отредактируйте и добавьте к своему вопросу.
сноски:
- примечание:
+
isn 'Это часть базовых регулярных выражений , и ее не нужно экранировать, но если есть какие-либо вопросы, безопаснее включить в собственный класс символов , например, [^a-z0-9][+]
.