Bash одинарні лапки в команді find


1

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

Отже, якщо я повторюю свою змінну, вони з'являться як, -iname "*.flv"але, як тільки вони знаходяться в команді find, вони -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 '{}' ';'

Відповіді:


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

Дякую, зараз це працює! Насправді я намагався реалізувати рішення масиву, яке ви запропонували в тій іншій потоці, але не зміг змусити його працювати.
посередній
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.