2010-10-29 3 views
3

Я создаю скрипт оболочки, который будет автоматизировать процесс установки Arch Linux AUR packages. Мне нужно перечислить все зависимости пакета (чтобы проверить, если они установлены), они появляются, как это в сценарии установки:Извлечение слов в кавычки в сценарии оболочки

depends=('sdl' 'libvorbis' 'openal') 

Самый простой способ (или только идея), что я мог придумать что-то вроде этого:

grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}' 

Но количество зависимостей варьируется от упаковки к упаковке. Итак, как я выводя имена в кавычках, если количество слов меняется?

Спасибо заранее,

-skazhy

ответ

1

Попробуйте это для размера:

grep "depends" PKGBUILD > /tmp/depends 
. /tmp/depends 

echo ${depends[@]} 

Эй смотрите, является то, что массив? Да.

for d in "${depends[@]}" ; do 
    printf '"%s"' "$d" 
done 

Примечание: в реальном сценарии вы хотите быть более осторожным с именованием временного файла.

+0

Зачем создавать временный файл whtn у вас есть "eval"? :) См. Мой ответ. –

+0

Потому что eval просто опасен. Sourcing менее рискован. – Sorpigal

+0

Извините, но в этом случае с источником (".") Вы просто * оцениваете * файл, который вы читаете ... –

0

Вы могли бы сделать что-то вроде:

grep "depends" PKGBUILD | perl -e "while(<>){print \"\$1\\n\" while m/'.{-}'/g;}" 
+0

Хм, я попробовал и не получил никаких результатов. – skazhy

4

Если depends - это всего лишь одна строка, вы можете попытаться оценить линию в самом bash ... Это приведет к массиву под названием «зависит», который содержит все значения. Кажется сложным, но не с динамическими языками:

depend_line=`grep depends $PKGBUILD` 
eval "${depend_line}" 
echo ${depend[0]} # Will print sdl in your example 
+0

+1 для предотвращения использования временного файла. –

0

awk -F"'" '{for(i=2;i<=NF;i+=2) print($i)}'

3

Вы можете избежать проблем безопасности при использовании eval или поиска временного файла с помощью declare:

declare -a "$(grep "depends" PKGBUILD)" 

Это создаст массив, называемый «зависит», содержащий «sdl», «libvorbis» и «openal» на основе данных примера.

+0

+1 от меня; это то, что я собирался предлагать в моей редакции, чтобы обойти этот вопрос eval/no eval. Гораздо лучше (и bashier) решение. – Sorpigal