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

Когда я пытаюсь передать аргументы как переменные любым командам в bash, я вижу дополнительные кавычки, добавленные bash, если значение переменной содержит пробелы.

Я создаю файл "some file.txt" и добавляю его в переменную $file. Я использую $file и сохраняю его в другой переменной $arg с кавычками в $file. Команда, на которую я надеюсь после расширения переменной с помощью bash, была

find . -name "some text.txt"

но я получил ошибку, и фактический файл, который был выполнен,

find . -name '"some' 'file.txt"

Почему это происходит. Как в этом случае работает расширение переменной bash?

$ touch "some file.txt"
$ file="some file.txt"
$ arg=" -name \"$file\""

$ find . $arg
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ set -x
$ find . $arg
+ find . -name '"some' 'file.txt"'
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Почему это происходит?


person anoop.babu    schedule 23.11.2015    source источник
comment
Из-за таких раздражающих вещей после примерно 1 часа написания сценариев оболочки я всегда бьюсь головой о стену.   -  person Adam Hughes    schedule 28.05.2020


Ответы (1)


Кавычки в значении параметра обрабатываются как буквальные символы после раскрытия параметра. Ваша попытка аналогична

find . -name \"some file.txt\"

нет

find . -name "some file.txt"

Для обработки аргументов, содержащих пробелы, вам нужно использовать массив.

file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"
person chepner    schedule 23.11.2015