1

У меня возникли проблемы с работой сценария оболочки. Я пытаюсь динамически сгенерировать команду find на основе ввода пользователя, и я сталкиваюсь с проблемой, заключающейся в том, что мои переменные в команде find заключаются в одинарные кавычки, как уже описано здесь.

Поэтому, если я выведу на экран мою переменную, они будут отображаться как -iname "*.flv" но как только они попадут в команду поиска, они -iname "*.flv" с одинарными кавычками и команда find не будет выполнена.

Я пытался реализовать ответы, данные в другой ветке SO, но я не могу понять это.

Есть идеи, что там не так?

Спасибо!

if [[ ! "$medium" == "" ]]
  then
    needles=$needles' -iname "'*$medium*'"'
  fi

  echo $needles
  #-iname "*.flv"

  echo $path
  #/Users/user/Movies/

  find "$path" $needles -type f -exec basename {} \; | gshuf -n 1
  # + find '/Users/user/Movies' -iname '"*dvd*"' -type f -exec basename '{}' ';'

1 ответ1

3

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

Лучше всего сделать needles массивом; в ответе на связанный вопрос тоже есть пример, но вот решение вашей конкретной проблемы:

# Make needles an empty array
needles=()

# If medium is not empty, add two parameters to needles:
if [[ -n $medium ]]; then
  # We quote *$medium* so that the asterisks won't get glob-expanded, and 
  # so that the value won't get word split even if it includes whitespace.
  # NO QUOTES ARE ADDED TO THE VALUE.
  needles+=(-iname "*$medium*")
fi

# The expression "{needles[@]}" means:
#   expand this into each element of needles (needles[@])
#   and don't expand the elements even if they include whitespace ("")
find "$path" "${needles[@]}" -type f -exec basename {} \; | gshuf -n 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .