Как заключить в двойные кавычки шаблон файлов с подстановочными знаками?

The HTTP 404, 404 Not Found and 404 error message is a Hypertext Transfer Protocol (HTTP) standard response code, in computer network communications, to indicate that the client was able to communicate with a given server, but the server could not find what was requested.

Вышеизложенное взято из Википедии

В вашем случае, возможно, у вас нет подключения к этой странице. Вы можете просто получить другой source.list и попробовать. Подсказка :вы можете использовать источник в вашей стране, что в большинстве случаев быстрее.

2
27.08.2020, 07:31
3 ответа

Если вы хотите соединить имена файлов, полученные в результате расширения глобуса с помощью символов SPC, вы можете сохранить их в позиционных параметрах и использовать "$*"для объединения:

set --./*.ext
IFS=' ' # SPC is the first character of $IFS by default, we're setting it
        # here in case that code is called in a context where it has been
        # modified before.
files_joined_with_SPC="$*"
cmd --flag "$files_joined_with_SPC"

или:

cmd --flag "$*"

конечно (напрямую, хотя легче упустить из виду тот факт, что это зависит от текущего значения$IFS).

Выше приведен стандартный синтаксис POSIX sh. В zsh/ksh93/bash/mksh/yashвы также можете использовать массив вместо позиционных параметров:

files=(./*.ext)
IFS=' '; files_joined_with_SPC="${files[*]}"

С zshвы также можете использовать:

files=(./*.ext)
cmd --flag "${(j[ ])files}"

Или с помощью анонимной функции:

(){ cmd --flag "${(j[ ])argv}"; }./*.ext

Где мы явно запрашиваем jсоединение с SPC, не полагаясь на глобальный параметр, такой как $IFS.

Обратите внимание, что SPC является таким же допустимым символом, как и любой другой в пути к файлу. Любой символ, кроме NUL, допустим в пути к файлу (, на самом деле любое значение байта , но 0 в большинстве систем, эти байты даже не должны формировать допустимые символы ), но NUL не может быть передан в аргумент команды, которая выполняется .

Вы не говорите, что этоcommand(кстати, command— это имя стандартной встроенной команды оболочки, я предпочитаю использовать cmdдля заполнителя ), но если это cmd --flag listпредназначен для приема любого списка имен файлов с разделителями SPC, у них должен быть способ позволить пользователям указывать SPCв имени файла.

Это может быть cmd --flag 'with\ space.ext other.ext'или cmd --flag 'with%20space.ext other.ext, cmd --flag 'with\040space.ext other.ext'и т. д.

В этом случае, при построении этого аргумента к cmd --flag,возможно, вам придется экранировать этот SPC (и, возможно, \или %символы )в именах файлов, прежде чем объединять их с помощью SPC.

В ksh93/ zsh/ bash/ yashэто можно было сделать с помощью:

escaped_files=("${files[@]//\\/\\\\}") # \ escaped as \\
escaped_files=("{files[@]// /\\ }")    # SPC escaped as \SPC
# more characters may need to be escaped such as other whitespace
# or quoting characters, depending on the exact syntax expected by
# cmd for the --flag option.

IFS=' '; escaped_files_joined_with_SPC="$*"
cmd -- flag "$escaped_files_joined_with_SPC"

(однако остерегайтесь локалей, которые используют кодировку символов, такую ​​как GB18030, BIG5... где некоторые символы содержат кодировку обратной косой черты (byte 0x5c ). Ваша оболочка может не избежать этих байтов 0x5c, но cmd --flagможет по-прежнему рассматривать их как обратную косую черту, если она не декодирует аргументы в соответствии с кодировкой локали ).

Более надежный/удобный способ для команд получить список имен файлов — просто использовать их как отдельные аргументы (, а не как аргументы параметра )или как cmd --flag 'file 1.ext' --flag 'file 2.ext'....

2
18.03.2021, 23:09

Чтобы получить все имена файлов в одной строке в кавычках:

command --flag "$(echo./*.ext)"

Как вы знаете, это работает только для простых имен файлов. Это означает отсутствие пробелов в именах файлов. В зависимости от значения xpg_echoэто также может означать отсутствие обратной косой черты (шляпный наконечник:кусалананда).

2
18.03.2021, 23:09

настроить цикл for расширенных файлов глобуса. Пусть переменная оболочки с именем var будет контейнером для имен файлов. На каждой итерации мы обновляем переменную оболочки var

var=
for f in *.ext; do var=${var-}${var:+ }$f; done
your_command --flag "$var"
1
18.03.2021, 23:09

Теги

Похожие вопросы